假设我有一个表"results",如下所示:
student | score | passing_grade
1 | 50 | 70
1 | 30 | 50
2 | 90 | 50
2 | 80 | 100
我想统计每个学生通过了多少次考试。结果如下:
student | passed
1 | 0
2 | 1
解释:学生1没有通过任何一项测试,而根据第二栏和第三栏的条件,学生2通过了2项测试中的1项。
我不知道这是否有什么不同,但我通过将两个表合并在一起创建了结果。我尝试使用WHERE子句来查找分数>通过交易,但我不知道方向是否正确。我也尝试过计数(当分数>passing_grade THEN 1 ELSE 0 END时的情况),但我不确定我做得是否正确,因为这对每一行都很重要。
这是一个简单的SQL查询。我建议在发布问题之前先阅读SQL基础知识并尝试一下。但由于你是这里的新贡献者(欢迎加入),包括可能有帮助的查询:
SELECT
student,
count(*) as passed
FROM results
WHERE
score > passing_grade
GROUP BY
student
;
您的COUNT
逻辑基本上是正确的,除了ELSE
非空值导致每条记录都算作一条。COUNT
函数只忽略null,因此ELSE
值应为null或ELSE
应完全省略:
SELECT student, COUNT(CASE WHEN score > passing_grade THEN 1 END) AS passed
FROM results
GROUP BY student;
请注意,MySQL支持直接求和布尔表达式,因此我们可以更严格地执行上面的操作:
SELECT student, SUM(score > passing_grade) AS passed
FROM results
GROUP BY student;
SELECT C.STUDENT,
SUM(
CASE
WHEN C.SCORE>=C.PASSING_GRADE THEN 1
ELSE 0
END
)AS PASSED
FROM RESULTS AS C
GROUP BY C.STUDENT
相同的逻辑,但具有SUM功能