如何使用SQL COUNT结合多GROUP BY按年份统计学生族裔人数
统计报表实现方案
完全可以通过COUNT函数配合分组逻辑生成目标维度统计表,不需要编写多组独立GROUP BY查询,单条SQL即可完成高效统计。
已知表结构映射
- 学生数据表:表名可记为
students,包含3个字段Student_id:学生唯一标识IDyear:学生就读年份ethnicity_id:关联族裔维度的ID
- 族裔维度表:表名可记为
ethnicities,包含2个字段Ethnicity_id:族裔唯一IDName:族裔显示名称,固定ID映射规则为:1=Black/AA、2=Hispanic/Latinx、3=Asian
核心实现逻辑
目标报表为典型的行转列聚合场景:行维度为就读年份,列维度为三个固定族裔,单元格为对应维度的学生去重计数。最优实现方式是仅按就读年份单字段做GROUP BY,在COUNT函数内通过条件判断分别统计对应族裔的学生数量,该写法仅需扫描一次学生表即可完成全量聚合,性能远高于多分组后关联的写法。
可直接复用的SQL代码
SELECT s.year AS 就读年份, COUNT(DISTINCT CASE WHEN s.ethnicity_id = 1 THEN s.Student_id END) AS `Black/AA`, COUNT(DISTINCT CASE WHEN s.ethnicity_id = 2 THEN s.Student_id END) AS `Hispanic/Latinx`, COUNT(DISTINCT CASE WHEN s.ethnicity_id = 3 THEN s.Student_id END) AS `Asian` FROM students s -- 若已确认ethnicity_id映射规则固定,可省略维度表关联,进一步提升查询速度 LEFT JOIN ethnicities e ON s.ethnicity_id = e.Ethnicity_id WHERE s.year IN (2022, 2023, 2024) GROUP BY s.year ORDER BY s.year;
注意事项
- 若确认学生表中
Student_id + year为唯一主键(即同一年份同一个学生不会出现重复记录),可去掉COUNT内的DISTINCT,进一步压缩查询耗时。 - 不建议编写3组独立GROUP BY查询再通过年份关联结果的写法,该写法会多次扫描全量学生数据,数据量级较大时性能损耗明显。
若需要统计所有就读年份的族裔分布,直接去掉WHERE子句中的年份筛选条件即可,查询结果会自动按表内实际存在的就读年份逐行输出统计值。
内容的提问来源于stack exchange,提问作者Jeremy B
相关产品推荐
相关产品推荐

