如何按状态分组统计表数据,缺失状态类别统计结果显示为0
解决方法
核心思路是先构造包含所有需要统计的状态的临时集合,再通过左连接关联业务表统计数量,就能得到缺失状态的0计数结果。
具体SQL实现(兼容大部分数据库的通用写法)
SELECT s.STATUS, COUNT(t.ID) AS TOTAL FROM ( -- 手动构造所有需要返回的状态列表 SELECT 'Pending' AS STATUS UNION ALL SELECT 'Received' AS STATUS UNION ALL SELECT 'Resolved' AS STATUS UNION ALL SELECT 'Rejected' AS STATUS ) s -- 左连接业务表,关联不上的状态对应业务表字段全为NULL LEFT JOIN 你的表名 t ON s.STATUS = t.STATUS GROUP BY s.STATUS -- 可选:按你需要的状态顺序排序 ORDER BY FIELD(s.STATUS, 'Pending', 'Received', 'Resolved', 'Rejected');
注意事项
- 统计计数不要用
COUNT(*),必须统计业务表的非空字段(比如示例里的t.ID),否则左连接生成的NULL行也会被计数为1,得到错误结果 - 如果需要额外添加业务过滤条件,必须写在
LEFT JOIN的ON子句中,不能写在WHERE子句里,否则会过滤掉关联失败的0计数行。比如要统计近30天的数,写法为:
LEFT JOIN 你的表名 t ON s.STATUS = t.STATUS AND t.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)
内容的提问来源于stack exchange,提问作者Koushik Roy
相关产品推荐
相关产品推荐

