每个月的GROUP BY,如果不存在月份,则返回0或NULL(MySQL)

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) 

我想要每个月实现的总小时数,但是实际上在3月中其他月份不存在,因为不存在我想要获得类似结果(仅求和列,但这只是一个例子)

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

并且不仅

Feb : 10
March : 42.75

请问您有解决办法吗?

wazhyhc 回答:每个月的GROUP BY,如果不存在月份,则返回0或NULL(MySQL)

如果您在表中拥有所有月份的数据-但没有该用户的数据-那么最简单(尽管效率最高)的方法是条件汇总:

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);
本文链接:https://www.f2er.com/2670367.html

大家都在问