SQL查询:无需按全列分组,统计指定Curriculum的总人数
解决方案
方法1:使用窗口函数(推荐,适用于支持SQL:2003及以上的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
直接通过窗口函数计算每个Curriculum对应的总人数,无需额外分组即可保留每条人员记录:
SELECT p.first_name, p.last_name, a.people_id, a.CURRICULUM, COUNT(*) OVER (PARTITION BY a.CURRICULUM) AS Curriculum_Count FROM academic a JOIN people p ON p.people_id = a.people_id WHERE a.curriculum IN ('bus', 'acc', 'eng')
说明:
COUNT(*) OVER (PARTITION BY a.CURRICULUM)会针对每个CURRICULUM分组统计总人数,并将该值附加到对应分组的每一行记录上,完全匹配你需要的结果格式。- 若
academic表中存在同一人员同一Curriculum的重复记录,可在SELECT后添加DISTINCT去重。
方法2:子查询预统计后关联(兼容旧版本数据库)
如果你的数据库不支持窗口函数,可以先单独统计每个Curriculum的总人数,再与主查询关联:
SELECT p.first_name, p.last_name, a.people_id, a.CURRICULUM, c.Curriculum_Count FROM academic a JOIN people p ON p.people_id = a.people_id JOIN ( SELECT CURRICULUM, COUNT(*) AS Curriculum_Count FROM academic WHERE CURRICULUM IN ('bus', 'acc', 'eng') GROUP BY CURRICULUM ) c ON a.CURRICULUM = c.CURRICULUM WHERE a.curriculum IN ('bus', 'acc', 'eng')
说明:
- 子查询
c先计算出指定Curriculum的总人数,再通过CURRICULUM字段与主表关联,将总人数映射到每一条人员明细记录中。
原查询问题说明
你的原查询使用GROUP BY academic.curriculum会将相同Curriculum的所有记录合并为一行,仅输出每个Curriculum的汇总结果,丢失了人员的明细信息;同时COUNT函数仅统计分组内的记录数,无法将总人数关联到每条人员记录上。
内容的提问来源于stack exchange,提问作者Neill
相关产品推荐
相关产品推荐

