如何编写SQL语句查询所有学生的及格(全科目≥35分)或不及格(任一科目<35分)状态
学生及格状态查询解决方案
这个问题的核心是要基于学生所有科目的成绩整体判断及格状态,而不是单条成绩记录的判断。你原来的SQL没有做分组处理,会返回每个学生的每一条成绩记录,而且逻辑只针对单条分数,不符合需求。我们可以通过分组计算每个学生的最低分来实现判断:
实现思路
因为及格规则是所有科目成绩≥35分,反过来理解就是:只要有任意一门科目分数<35,就判定为不及格。所以我们可以先按学生分组,找到每个学生的最低分——如果最低分≥35,说明所有科目都及格;反之则存在不及格科目。
最终SQL语句
SELECT s.Student_Id AS student_id, s.Student_name AS student_name, CASE WHEN MIN(m.marks) >= 35 THEN 'Pass' ELSE 'Fail' END AS status FROM Student s INNER JOIN Marks m ON s.Student_Id = m.student_id GROUP BY s.Student_Id, s.Student_name;
结果验证
执行这条SQL后,会得到你期望的输出:
| student_id | student_name | status |
|---|---|---|
| 1 | AAAA | Fail |
| 2 | BBBB | Pass |
- 学生1的最低分是34(小于35),所以判定为
Fail - 学生2的最低分是42(≥35),所以判定为
Pass
补充说明
如果你使用的是支持IF函数的数据库(比如MySQL),也可以把CASE WHEN替换成IF写法,效果完全一致:
SELECT s.Student_Id AS student_id, s.Student_name AS student_name, IF(MIN(m.marks) >= 35, 'Pass', 'Fail') AS status FROM Student s INNER JOIN Marks m ON s.Student_Id = m.student_id GROUP BY s.Student_Id, s.Student_name;
内容的提问来源于stack exchange,提问作者Dyapa Srikanth
相关产品推荐
相关产品推荐

