如何在SQL中比较两个Count()值 查询2009年选课多于2010年的学生ID
你可以通过两种方式实现两个年度选课数量的对比:
方法一:条件聚合(推荐,执行效率更高)
只需要扫描一次表即可完成统计,逻辑简洁:
SELECT stud_id FROM Takes WHERE year IN (2009, 2010) GROUP BY stud_id HAVING COUNT(CASE WHEN year = 2009 THEN class_id END) > COUNT(CASE WHEN year = 2010 THEN class_id END);
原理说明:COUNT函数不会统计NULL值,CASE语句会对非对应年份的数据返回NULL,由此就能分别统计出每个学生2009和2010年的选课数量,直接在HAVING子句中完成对比筛选即可。
如果你的数据库支持IF函数,还可以写成更简化的版本:
SELECT stud_id FROM Takes WHERE year IN (2009, 2010) GROUP BY stud_id HAVING COUNT(IF(year=2009,1,NULL)) > COUNT(IF(year=2010,1,NULL));
方法二:子查询关联(逻辑更直观)
就是基于你已经写好的单年度统计逻辑,分别统计两年的选课数后关联对比:
SELECT t2009.stud_id FROM (SELECT stud_id, COUNT(class_id) AS cnt_2009 FROM Takes WHERE year = 2009 GROUP BY stud_id) t2009 LEFT JOIN (SELECT stud_id, COUNT(class_id) AS cnt_2010 FROM Takes WHERE year = 2010 GROUP BY stud_id) t2010 ON t2009.stud_id = t2010.stud_id WHERE t2009.cnt_2009 > IFNULL(t2010.cnt_2010, 0);
原理说明:用左关联保留所有2009年有选课记录的学生,IFNULL函数会把2010年没有选课的学生的选课数转为0,避免NULL值参与对比导致结果错误。
内容的提问来源于stack exchange,提问作者KOKODE
相关产品推荐
相关产品推荐

