You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:39:04