SQL group by分组统计如何对齐指定列表并给缺失类型补0
解决方案
核心思路是先生成包含所有期望输出类型{a,b,c,d}的完整维度列表,再和业务统计结果做左关联,没有匹配到的类型统计值自动补0即可。
通用兼容写法(适配绝大多数SQL数据库)
SELECT t.type, COUNT(your_table.type) AS type_count FROM ( -- 构造全量期望类型列表 SELECT 'a' AS type UNION ALL SELECT 'b' UNION ALL SELECT 'c' UNION ALL SELECT 'd' ) AS t LEFT JOIN your_table ON t.type = your_table.type GROUP BY t.type ORDER BY t.type;
说明:使用
COUNT(your_table.type)而非COUNT(*)是因为左关联未匹配的行中your_table.type为NULL,COUNT会自动跳过NULL值,最终返回0,完全符合补0需求。使用前请将your_table替换为实际业务表名。
特定数据库简化写法
MySQL 8.0+/PostgreSQL
可直接用VALUES构造类型列表,语法更简洁:
SELECT t.type, COUNT(your_table.type) AS type_count FROM ( VALUES ('a'),('b'),('c'),('d') ) AS t(type) LEFT JOIN your_table ON t.type = your_table.type GROUP BY t.type ORDER BY t.type;
存在类型字典表的场景
如果业务侧有单独存储全量类型的字典表type_dict,无需硬编码类型,可直接关联字典表:
SELECT t.type, COUNT(your_table.type) AS type_count FROM type_dict t LEFT JOIN your_table ON t.type = your_table.type -- 若只需返回指定4种类型可打开下方注释 -- WHERE t.type IN ('a','b','c','d') GROUP BY t.type ORDER BY t.type;
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

