如何在SQL中对1-3月分组统计,无数据月份显示0?
解决无数据月份显示0的分组统计问题
原SQL无法返回无数据的2月,是因为GROUP BY只会统计表中存在数据的分组。要实现无数据月份显示0,需要先构建包含目标月份的完整集合,再与原表统计结果关联。
核心思路
- 生成包含1、2、3月的基础月份列表,确保所有需统计的月份都存在;
- 使用
LEFT JOIN将基础列表与原表A关联,匹配对应月份的数据; - 分组统计时,用
COUNT()或COALESCE()处理无数据的情况,返回0。
具体实现
MySQL
WITH months AS ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 ) SELECT m.month AS `Month`, COUNT(a.id) AS `Count` FROM months m LEFT JOIN A a ON MONTH(a.DateStart) = m.month GROUP BY m.month ORDER BY m.month;
SQL Server
WITH months AS ( SELECT month FROM (VALUES (1), (2), (3)) AS t(month) ) SELECT m.month AS [Month], COALESCE(COUNT(a.id), 0) AS [Count] FROM months m LEFT JOIN A a ON MONTH(a.DateStart) = m.month GROUP BY m.month ORDER BY m.month;
PostgreSQL
WITH months AS ( SELECT generate_series(1,3) AS month ) SELECT m.month AS "Month", COALESCE(COUNT(a.id), 0) AS "Count" FROM months m LEFT JOIN A a ON EXTRACT(MONTH FROM a.DateStart) = m.month GROUP BY m.month ORDER BY m.month;
说明
LEFT JOIN保证基础列表中的所有月份都会被保留,即使原表中没有对应月份的数据;COUNT(a.id)会自动忽略NULL值,无匹配数据时返回0;COALESCE()则是显式将NULL转换为0,效果一致;- 若需要统计指定年份的1-3月,可在关联条件中添加年份判断(例如
AND YEAR(a.DateStart) = 2020),避免跨年份统计。
内容的提问来源于stack exchange,提问作者Hùng Lê Văn
相关产品推荐
相关产品推荐

