Объединение нескольких объединений в один выбор / кейс - PullRequest
0 голосов
/ 06 июля 2018

В настоящее время я запрашиваю таблицу 4 раза, используя разные критерии, а затем использую левые соединения как часть более крупного запроса, чтобы вернуть все данные. Более крупный запрос выполняется не особенно быстро, и я уверен, что мой нынешний подход неэффективен.

Что мне интересно, так это то, возможно ли каким-либо образом использовать оператор CASE для увеличения одного из 4 столбцов. Мои 4 запроса в настоящее время:

SELECT ts.department, 
                         Sum([hours]) AS ChargeableTimeYTD 
                  FROM   bwbfiles.sos.timesummary ts 
                  WHERE  category = 'C' 
                         AND [year] = '2019' 
                  GROUP  BY department


SELECT ts.department, 
                         Sum([hours]) AS ChargeableTimeMTD 
                  FROM   bwbfiles.sos.timesummary ts 
                  WHERE  category = 'C' 
                         AND [year] = '2019' 
                         AND [period] = 4 
                  GROUP  BY department


SELECT ts.department, 
                         Sum([hours]) AS NonChargeableTimeProBono 
                  FROM   bwbfiles.sos.timesummary ts 
                  WHERE  category = 'NC' 
                         AND ( [act_code] = '001N' 
                                OR [act_code] = '00N6' ) 
                         AND [year] = '2019' 
                  GROUP  BY department


SELECT ts.department, 
                         Sum([hours]) AS NonChargeableTimeNonProBono 
                  FROM   bwbfiles.sos.timesummary ts 
                  WHERE  category = 'NC' 
                         AND ( [act_code] <> '001N' 
                               AND [act_code] <> '00N6' ) 
                         AND [year] = '2019' 
                  GROUP  BY department

Целью было бы получить результат запроса с 5 столбцами Отдел, ChargeableTimeYTD, ChargeableTimeMTD, NonChargeableTimeProBono, NonChargeableTimeNonProBono

Или вместо CASE я бы удалил группу по отделам из каждого бита и получил бы запрос, который выдал 3 столбца

Отдел, Часы, Категория (где Категория - ChargeableTimeYTD / ChargeableTimeMTD и т. Д. ... и т. Д.), А затем разделите это на 5 столбцов.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Это может сделать то, что я думаю, что вы просите

SELECT ts.department, 
    Sum(case when category = 'C' then [hours] else 0 end) AS ChargeableTimeYTD,
    Sum(case when category = 'C' and [period] = 4 then [hours] else 0 end) AS ChargeableTimeMTD,
    Sum(case when category = 'NC' and ([act_code] = '001N' or [act_code] = '00N6') then [hours] else 0 end) AS NonChargeableTimeProBono,
    Sum(case when category = 'NC' and ([act_code] <> '001N' or [act_code] <> '00N6') then [hours] else 0 end) AS NonChargeableTimeNonProBono
FROM   bwbfiles.sos.timesummary ts 
where [year] = '2019'
and [category] in ('C','NC')
GROUP  BY department
...