Несколько СУММ в одном запросе с несколькими где - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь написать запрос SQL, который создает таблицу со сводными значениями для каждого года и месяца.

У меня есть таблица, которая выглядит примерно так:

TABLENAME: TIME
id     cID     cDate         cTime 
 1     254     2019-10-11    5    
 2     259     2019-10-13    4    
 3     268     2020-01-17    6
 4     268     2020-01-18    9
 5     271     2020-01-21    4
 6     267     2020-02-19    8

И еще одна таблица, которая выглядит так:

TABLENAME: CASE
id     name     invoice      status
254    Acme     Yes          finish
259    Tex      NoFakt       finish
268    Rex C    Yes          *Null*
267    Hydro    *Null*       open
271    Corp     Yes          finish

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

Year    Month    RegTime    Invoiced   ToBeInvoiced
2019    10       5          5          0
2019    11       0          0          0
2019    12       0          0          0
2020     1       19         4          15
2020     2       8          0          8

Объяснение выходных данных:

Год и месяц очевидны

RegTime должен быть суммой всех TIME.cTime, ГДЕ CASE.invoice <> 'NoFakt'

Выставленный счет должен быть суммой всех TIME. cTIME WHERE CASE.invoice = 'Yes' AND CASE.status = 'fini sh'

ToBeInvoiced должно быть суммой всех TIME.cTIME, ГДЕ CASE.invoice = 'Yes' И CASE.status <> 'fini sh'

Я пробовал этот запрос, но с этим мне нужно l oop предопределенное значение года и месяца в моем программном коде вместо того, чтобы просто иметь оператор sql, который выполняет вся работа. Должен быть более простой способ, чем этот ...

select (select sum(cTIME) from TIME inner join CASE on TIME.cID = CASE.id WHERE CASE.invoice <> 'NoFakt' AND DATEPART(yy, cDate) = '2019' AND DATEPART(mm, cDate) = '10') AS RegTime,
(select sum(cTIME) from TIME inner join CASE on TIME.cID = CASE.id WHERE CASE.invoice = 'Yes' AND CASE.status = 'finish' AND DATEPART(yy, cDate) = '2019' AND DATEPART(mm, cDate) = '10') AS Invoiced,
(select sum(cTIME) from TIME inner join CASE on TIME.cID = CASE.id WHERE CASE.invoice = 'Yes' AND CASE.status <> 'finish' AND DATEPART(yy, cDate) = '2019' AND DATEPART(mm, cDate) = '10') AS ToBeInvoiced 

1 Ответ

4 голосов
/ 27 февраля 2020

Использование conditional агрегации:

SELECT YEAR(T.cDate) AS YR, MONTH(T.cDate) AS Mnth,
       SUM(CASE WHEN C.invoice <> 'NoFakt' THEN C.cTIME ELSE 0 END) AS RegTime,
       SUM(CASE WHEN C.invoice = 'Yes' AND C.status = 'finish' THEN C.cTIME ELSE 0 END) AS Invoiced,
       SUM(CASE WHEN C.invoice = 'Yes' AND C.status <> 'finish' THEN C.cTIME ELSE 0 END) AS ToBeInvoiced
FROM TIME T INNER JOIN 
     CASE C
     ON T.cID = C.id
GROUP BY YEAR(T.cDate), MONTH(T.cDate);

Примечание. Не используйте ключевое слово reserved в качестве имени объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...