【问题标题】:GROUP BY for each Month and return 0 or NULL if not month exists (MySQL)每个月的 GROUP BY,如果不存在月份,则返回 0 或 NULL (MySQL)
【发布时间】:2020-03-10 15:20:55
【问题描述】:
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

请问有解决办法吗?

【问题讨论】:

  • 外部加入帮助表/cte 返回所有 12 个月。
  • 您是否有代码示例,因为要在哪个表上进行连接?

标签: mysql sql mysql-8.0


【解决方案1】:

如果您在表中有所有月份的数据——但只是没有那个用户的数据——那么最简单(虽然不是最有效)的方法是条件聚合:

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);

【讨论】:

  • 第一个查询返回相同的结果第二个有一个错误,我有一个包含所有月份但链接的表:pointage -> user / user-> monthHours /monthHours -> 月(在哪里注册了 12 个月)
  • @Amelya 。 . .你需要在剩下的几个月里填写。这就是. . . 的用途。
  • 好吧,我们必须删除所有最后的联合,我现在要测试我的学说 orm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2015-10-05
  • 2012-07-11
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多