GROUP BY для каждого месяца и возвращает 0 или NULL, если не существует месяца (MySQL) - PullRequest
1 голос
/ 10 марта 2020
SELECT COALESCE(SUM(p.hours),0) as recap
FROM pointage p
WHERE YEAR(date_point) = '2020' AND p.user_id = 1
GROUP BY MONTH(date_point) 

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

Jan : NULL
Feb : 10
March : 42.75
APR : NULL
MAY : NULL
..
DEC : NULL

И не только

Feb : 10
March : 42.75

У вас есть решение, пожалуйста?

1 Ответ

1 голос
/ 10 марта 2020

Если у вас есть данные за все месяцы в таблице - но только не для этого пользователя - тогда самый простой (хотя и не самый эффективный) подход - это условное агрегирование:

SELECT MONTH(date_point) as mon,
       SUM(CASE WHEN p.user_id = 1 THEN p.hours END) as recap
FROM pointage p
WHERE YEAR(date_point) = 2020 
GROUP BY MONTH(date_point) ;

В противном случае вам нужно список месяцев, который может быть сгенерирован разными способами - календарная таблица, рекурсивное CTE, явно:

select m.mon, sum(p.hours)
from (select 'Jan' as mon, 1 as mm union all
      select 'Feb' as mon, 2 as mm union all
      . . .
     ) m left join
     pointage p
     on p.date_point >= '2020-01-01' and '2021-01-01' and
        p.user_id = 1 and
        month(p.date_point) = m.mm
group by m.mon
order by min(m.mm);
...