SQL查询如何筛选2020和2021年每年均至少通过一次的课程
问题分析
你现有SQL的问题出在分组规则上:按course和year双字段分组后,返回的是所有单年满足通过要求的课程记录,无法验证该课程是否同时覆盖2020、2021两个年份的通过条件。
正确实现方案
方案1:按课程单分组,分别校验年份条件
SELECT course FROM grade WHERE year IN (2020, 2021) GROUP BY course HAVING SUM(CASE WHEN year = 2020 AND pass = 'Yes' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN year = 2021 AND pass = 'Yes' THEN 1 ELSE 0 END) > 0;
如果你的pass字段是标准布尔类型,把pass = 'Yes'替换为pass = TRUE即可。
方案2:通用扩展写法
如果后续需要适配更多年份的校验,推荐这种写法:
SELECT course FROM grade WHERE year IN (2020, 2021) AND pass = 'Yes' -- 先过滤未通过记录,降低后续计算开销 GROUP BY course HAVING COUNT(DISTINCT year) = 2;
需要调整校验年份数量时,只需修改WHERE条件里的年份范围,以及HAVING里的计数值等于需要校验的年份总数即可。
样例匹配说明
针对你给出的样例数据,上述SQL执行结果为空,因为样例中不存在同时在2020、2021年都有通过记录的课程。
内容的提问来源于stack exchange,提问作者kinder chen
相关产品推荐
相关产品推荐

