SQL按条件年龄区间汇总人口数问题求助
按年龄区间汇总普查人口数据的SQL解决方案
你的问题出在分组逻辑上——原来的脚本错误地将单个年龄值和人口数纳入了分组条件,导致每个细分项都被单独分组,无法实现按区间汇总的效果。下面是修正后的方案,以及对你原有问题的拆解:
修正后的SQL脚本(简洁版)
SELECT State, CASE WHEN age BETWEEN 18 AND 23 THEN '18-23' WHEN age BETWEEN 24 AND 35 THEN '24-35' ELSE '36-85' END AS ranges, race, origin, sex, SUM(pop) AS total_pop FROM [StateSexOriginRaceAge] WHERE sex > 0 -- 行级过滤用WHERE,比HAVING更高效 GROUP BY State, -- 分组时复用区间逻辑,兼容多数SQL引擎 CASE WHEN age BETWEEN 18 AND 23 THEN '18-23' WHEN age BETWEEN 24 AND 35 THEN '24-35' ELSE '36-85' END, race, origin, sex ORDER BY State, ranges, race, origin, sex;
如果你更倾向于用子查询拆分逻辑(可读性更好),可以用这个版本:
SELECT State, ranges, race, origin, sex, SUM(pop) AS total_pop FROM ( SELECT CASE WHEN age BETWEEN 18 AND 23 THEN '18-23' WHEN age BETWEEN 24 AND 35 THEN '24-35' ELSE '36-85' END AS ranges, State, race, sex, origin, pop FROM [StateSexOriginRaceAge] WHERE sex > 0 ) AS tbl GROUP BY State, ranges, race, origin, sex ORDER BY State, ranges, race, origin, sex;
原有脚本的问题拆解
- 错误的分组条件:你在子查询里把
age和pop都加入了GROUP BY,这会让每个单独的年龄值(比如18、19、20...)和每个单独的人口数都成为独立分组,完全没有按你定义的年龄区间合并。 - 冗余且错误的聚合逻辑:子查询里已经用
SUM(pop),但外层又把汇总后的pop加入GROUP BY,这会把每个不同的汇总值再次拆分,导致结果行数暴增。 - HAVING的误用:
sex > 0是行级过滤条件,应该用WHERE而不是HAVING——HAVING是用来过滤聚合后的结果(比如SUM(pop) > 1000),用在这儿不仅逻辑不对,还会降低查询效率。
内容的提问来源于stack exchange,提问作者Jordan Brooklyn
相关产品推荐
相关产品推荐

