能否编写单表SQL SELECT语句 按条件返回两列统计各年龄不同性别人数
实现方案
这个需求属于典型的行转列统计场景,用条件聚合配合年龄序列补全即可实现,完整SQL如下(兼容绝大多数SQL dialect):
SELECT COUNT(CASE WHEN gender = 'male' THEN 1 END) AS male, COUNT(CASE WHEN gender = 'female' THEN 1 END) AS female FROM ( -- 生成18/19/20三个年龄的完整序列,保证无数据的18岁分组也能输出 SELECT 18 AS age UNION ALL SELECT 19 AS age UNION ALL SELECT 20 AS age ) AS age_groups LEFT JOIN person ON age_groups.age = person.`age (18-20)` GROUP BY age_groups.age ORDER BY age_groups.age
逻辑说明
- 内层通过
UNION ALL生成固定的18、19、20三个年龄的临时表,避免因为原表没有18岁数据导致这一行缺失 - 用左关联把原person表中对应年龄的记录关联到对应年龄分组上
- 分组后通过
CASE WHEN判断性别,匹配对应性别时返回有效值,不匹配时返回NULL,COUNT会自动忽略NULL值,最终得到各年龄分组下的男女计数
如果不需要保留无数据的18岁分组,也可以直接对原表分组统计:
SELECT COUNT(CASE WHEN gender = 'male' THEN 1 END) AS male, COUNT(CASE WHEN gender = 'female' THEN 1 END) AS female FROM person GROUP BY `age (18-20)`
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

