You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中对1-3月分组统计,无数据月份显示0?

解决无数据月份显示0的分组统计问题

原SQL无法返回无数据的2月,是因为GROUP BY只会统计表中存在数据的分组。要实现无数据月份显示0,需要先构建包含目标月份的完整集合,再与原表统计结果关联。

核心思路

  1. 生成包含1、2、3月的基础月份列表,确保所有需统计的月份都存在;
  2. 使用LEFT JOIN将基础列表与原表A关联,匹配对应月份的数据;
  3. 分组统计时,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:22:37