Разделение результатов GROUP BY на разные столбцы - PullRequest
1 голос
/ 05 марта 2019

У меня есть столбец, содержащий диапазоны дат и количество прошедших дней, связанных с конкретным ID (от одного до многих), исходя из количества связанных с ним записей. Я хочу, чтобы эти результаты были разбиты на столбцы, а не на отдельные строки. так из этого:

id_hr  dd beg          end
----------------------------------------
1      10 05/01/2019   15/01/2019
1      5  03/02/2019   08/02/2019
2      8  07/03/2019   15/03/2019

Может стать таким:

id_hr  dd beg          end        dd beg          end
--------------------------------- ---------------------
1      10 05/01/2019   15/01/2019 5  03/02/2019   08/02/2019
2      8  07/03/2019   15/03/2019

Я сделал то же самое на рабочем листе (сводная таблица), но таблица стала настолько медленной, насколько это возможно, поэтому я ищу более дружественный подход в SQL, я сделал CTE, который нумерует связанные строки, а затем выбрал каждый и отображать их в новых столбцах.

;WITH CTE AS(
   SELECT PER_PRO, ID_HR, NOM_INC, rut_dv, dias_dur, INI, FIN,
       ROW_NUMBER()OVER(PARTITION BY ID_HR ORDER BY SUBIDO) AS RN
   FROM dbo.inf_vac WHERE PER_PRO = 201902
)
SELECT ID_HR, NOM_INC, rut_dv,
    (case when rn = 1 then DIAS_DUR end) as DIAS_DUR1,
    (case when rn = 1 then INI end) as INI1,
    (case when rn = 1 then FIN end) as FIN1,

    (case when rn = 2 then DIAS_DUR end) as DIAS_DUR2,
    (case when rn = 2 then INI end) as INI2,
    (case when rn = 2 then FIN end) as FIN2,

    (case when rn = 3 then DIAS_DUR end) as DIAS_DUR3,
    (case when rn = 3 then INI end) as INI3,
    (case when rn = 3 then FIN end) as FIN3
FROM CTE

Что приводит меня к каждому столбцу, где он должен быть, но не сгруппирован. Использование GROUP BY отображает ошибку при выборе CTE.

rn id_hr  dd    beg          end        dd    beg          end
----------------------------------- ------------------------
1  1      10   05/01/2019   15/01/2019 NULL  NULL         NULL
2  1      NULL NULL         NULL       5     03/02/2019   08/02/2019
1  2      8    07/03/2019   15/03/2019 NULL  NULL         NULL

Есть ли способ сгруппировать их по второму выбору?

Ответы [ 2 ]

1 голос
/ 05 марта 2019

В наборе результатов есть дополнительные столбцы, которых нет в запросе. Однако это должно работать:

SELECT ID_HR,
       max(case when rn = 1 then DIAS_DUR end) as DIAS_DUR1,
       max(case when rn = 1 then INI end) as INI1,
       max(case when rn = 1 then FIN end) as FIN1,

       max(case when rn = 2 then DIAS_DUR end) as DIAS_DUR2,
       max(case when rn = 2 then INI end) as INI2,
       max(case when rn = 2 then FIN end) as FIN2,

       max(case when rn = 3 then DIAS_DUR end) as DIAS_DUR3,
       max(case when rn = 3 then INI end) as INI3,
       max(case when rn = 3 then FIN end) as FIN3
FROM CTE
GROUP BY ID_HR;
1 голос
/ 05 марта 2019

Да, вы можете GROUP BY для всех столбцов, не относящихся к CASE, и применять MAX к каждому из столбцов выражения CASE.

...