SQL按条件聚合行值:将≥5的年龄合并为‘5+’统计人口
问题描述
现有如下SQL查询语句:
SELECT Year, geo_code, Age, COUNT(*) AS Population FROM table_1 WHERE geo_code = 'AB23' AND Year = 2023 GROUP BY Year, geo_code, Age
执行后得到的结果如下:
| Year | geo_code | Age | Population |
|---|---|---|---|
| 2023 | AB23 | 1 | 10 |
| 2023 | AB23 | 2 | 12 |
| 2023 | AB23 | 3 | 11 |
| 2023 | AB23 | 5 | 14 |
| 2023 | AB23 | 6 | 10 |
| 2023 | AB23 | 7 | 5 |
现在需要将年龄≥5的人口统计聚合为5+分组,期望输出结果如下:
| Year | geo_code | Age | Population |
|---|---|---|---|
| 2023 | AB23 | 1 | 10 |
| 2023 | AB23 | 2 | 12 |
| 2023 | AB23 | 3 | 11 |
| 2023 | AB23 | 5+ | 29 |
请问如何修改SQL代码实现该需求?
解决方案
可以通过CASE语句对年龄进行分组转换,再基于转换后的分组做聚合统计,修改后的SQL如下:
SELECT Year, geo_code, CASE WHEN Age >= 5 THEN '5+' ELSE CAST(Age AS VARCHAR) END AS Age, COUNT(*) AS Population FROM table_1 WHERE geo_code = 'AB23' AND Year = 2023 GROUP BY Year, geo_code, CASE WHEN Age >= 5 THEN '5+' ELSE CAST(Age AS VARCHAR) END
逻辑说明
- 分组标记:用
CASE判断每条记录的年龄,≥5的统一标记为5+,其余保留原年龄值(转换为字符串是为了保证分组字段类型一致,避免分组异常)。 - 匹配分组规则:
GROUP BY子句必须和SELECT里的分组规则完全一致,这样才能让相同分组的记录被正确聚合。 - 统计聚合:
COUNT(*)会统计每个分组内的总记录数,最终得到合并后的结果。
如果你的数据库支持GROUP BY直接引用SELECT中的别名(比如MySQL 8.0+、PostgreSQL等),可以简化GROUP BY部分:
SELECT Year, geo_code, CASE WHEN Age >= 5 THEN '5+' ELSE CAST(Age AS VARCHAR) END AS Age, COUNT(*) AS Population FROM table_1 WHERE geo_code = 'AB23' AND Year = 2023 GROUP BY Year, geo_code, Age
内容的提问来源于stack exchange,提问作者zhd
相关产品推荐
相关产品推荐

