按年龄区间分组统计,需显示无数据区间的0计数问题
解决按年龄区间分组显示所有区间(含0值)的问题
要让所有定义好的年龄区间都显示,哪怕该区间没有数据,核心思路是先构造出所有需要的年龄区间集合,再和原表的统计结果做左连接,这样就能保留所有区间,无数据的区间count会被填充为0。
最终可行的SQL查询
WITH age_groups AS ( SELECT '0-18' AS age_group UNION ALL SELECT '19-30' UNION ALL SELECT '31-35' UNION ALL SELECT '36-50' UNION ALL SELECT '50+' ) SELECT ag.age_group, COALESCE(p.count, 0) AS count FROM age_groups ag LEFT JOIN ( SELECT CASE WHEN age BETWEEN 0 AND 18 OR age IS NULL THEN '0-18' WHEN age BETWEEN 19 AND 30 THEN '19-30' WHEN age BETWEEN 31 AND 35 THEN '31-35' WHEN age BETWEEN 36 AND 50 THEN '36-50' WHEN age BETWEEN 51 AND 100 THEN '50+' END AS age_group, COUNT(*) AS count FROM patient_registration GROUP BY age_group ) p ON ag.age_group = p.age_group ORDER BY CASE ag.age_group WHEN '0-18' THEN 1 WHEN '19-30' THEN 2 WHEN '31-35' THEN 3 WHEN '36-50' THEN 4 WHEN '50+' THEN 5 END;
说明
- 构造固定区间集合:用
WITH子句创建age_groups临时表,包含你需要的所有年龄区间,确保每个区间都被定义。 - 左连接统计结果:将临时表和原查询的统计结果做左连接,这样即使原查询中没有某区间的数据,临时表的该区间也会被保留。
- 填充0值:用
COALESCE(p.count, 0)把左连接后出现的NULL替换为0,符合你的需求。 - 排序保证顺序:添加
ORDER BY子句确保结果按年龄区间的逻辑顺序展示,避免字符串排序导致的顺序混乱。
内容的提问来源于stack exchange,提问作者Si Tech
相关产品推荐
相关产品推荐

