Добавить данные в разделенные строки - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу знать, сколько людей было недоступно за месяцы исторически, для этого у меня есть historicTable, который содержит данные с 2012 по 2018 год, и в каждой строке указывается, сколько времени сотрудник не имел в наличии (отпуска, болезнии т. д.) Это один из примеров:

idUser startDate    endDate     daysUn    reason    nameEmp
--------------------------------------------------------
123    25/01/2018   09/02/2018  12        Sickness  John Doe

Это то, что мне нужно для каждой строки

idUser startDate    endDate     daysUn    reason    nameEmp
--------------------------------------------------------
123    25/01/2018   31/01/2018   5        Sickness  John Doe
123    01/01/2018   09/02/2018   7        Sickness  John Doe

Я знаю, что меня спрашивали здесь сотни раз, но у меня возникают проблемы при выполненииэто для всей таблицы, для того, что я пробовал в разных ответах, вся работа процесса для определения заданных столбцов startdate и enddate и что мне нужно, это добавить ВСЕ данные в эту таблицу и сохранить их как есть, чтобы аналитик смогизучить конкретные случаи и конкретных сотрудников.Вот то, что я получаю с моим текущим кодом:

original_INI            original_FIN            new_INI                 new_FIN
----------------------- ----------------------- ----------------------- -----------------------
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-10-15 00:00:00.000 2017-10-31 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-11-01 00:00:00.000 2017-11-30 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2017-12-01 00:00:00.000 2017-12-31 00:00:00.000
2017-10-15 00:00:00.000 2018-01-06 00:00:00.000 2018-01-01 00:00:00.000 2018-01-06 00:00:00.000

Это код, с исходными датами все в порядке, поскольку я могу сортировать данные более глобально, но это может напечатать и сохранить остальную частьданные, чтобы они были более читабельными:

;WITH n(n) AS 
(
  SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns
),
d(n,f,t,md,bp,ep) AS 
(
  SELECT n.n, d.INI, d.FIN, 
    DATEDIFF(MONTH, d.INI, d.FIN),
    DATEADD(MONTH, n.n, DATEADD(DAY, 1-DAY(INI), INI)),
    DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.n, 
      DATEADD(DAY, 1-DAY(INI), INI))))
 FROM n INNER JOIN archivoFuente AS d 
 ON d.FIN >= DATEADD(MONTH, n.n-1, d.INI)
)
SELECT original_INI = f, original_FIN = t, 
  new_INI = CASE n WHEN 0  THEN f ELSE bp END,
  new_FIN   = CASE n WHEN md THEN t ELSE ep END 
FROM d WHERE md >= n
ORDER BY original_INI, new_INI;

Любая помощь с запросом приветствуется.

1 Ответ

0 голосов
/ 04 февраля 2019

На самом деле это довольно просто, я использовал один и тот же код для своих требований, вам нужно вызывать каждый столбец в каждом select утверждении , чтобы он существовал при разбиении строк, проверьте этот код:

;WITH n(n) AS 
(
SELECT ROW_NUMBER() OVER (ORDER BY [object_id])-1 FROM sys.all_columns
),
d(n,f,t,md,bp,ep,
--CALL YOUR COLUMNS HERE EG: name, id, bla, ble
) AS  
(
SELECT n.n,d.INI, d.FIN,
    DATEDIFF(MONTH, d.INI, d.FIN),
    DATEADD(MONTH, n.n, DATEADD(DAY, 1-DAY(INI), INI)),
    DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, n.n, 
    DATEADD(DAY, 1-DAY(INI), INI)))),
    --CALL YOUR COLUMNS HERE AGAIN, PAY ATTENTION TO NAMES AND COMMAS
    d.id_hr,d.Tipo,d.ID_tip,d.Nom_inc,d.RUT,d.Nombre,d.ID_emp,d.Nom_pos,d.Dias_durac,d.Num_lic,d.ID_usu_ap,d.ult_act
FROM n INNER JOIN archivoFuente AS d 
ON d.FIN >= DATEADD(MONTH, n.n-1, d.INI)
)
SELECT --PUT ONCE AGAIN YOUR COLUMNS HERE, THIS WILL WORK FOR THE DISPLAYED RESULT
original_INI = f, original_FIN = t,
new_INI = CASE n WHEN 0  THEN f ELSE bp END,
new_FIN = CASE n WHEN md THEN t ELSE ep END
FROM d 
WHERE md >= n
ORDER BY original_INI, new_INI;

Теперь, чтобы сохранить таблицу, я бы рекомендовал использовать оператор INSERT для новой таблицы, как вы это сделаете, я не знаю, я в том же месте, что и вы,Надеюсь, кто-нибудь проверит этот вопрос.

...