SQL Server查询需求:统计各课程得A学生数并返回所有课程
问题分析与修正方案
原查询存在几个关键问题,导致无法展示得A人数为0的课程:
- LEFT JOIN语法错误:正确写法是
LEFT JOIN Grades B ON A.Course_ID = B.Course_ID,你把on的位置写错了 - WHERE子句过滤了无匹配的课程:
WHERE B.Grades = 'A'会直接剔除左连接中没有学生得A的课程(此时B的所有字段为NULL,不满足该条件) - GROUP BY包含多余字段:
B.Grades不需要出现在分组里,我们只需要按课程维度分组
修正后的查询写法(两种可选)
方法一:将筛选条件移至JOIN的ON子句
SELECT A.Title, COUNT(B.Course_ID) AS [Number of A's] FROM Courses A LEFT JOIN Grades B ON A.Course_ID = B.Course_ID AND B.Grades = 'A' GROUP BY A.Title, A.Course_ID ORDER BY A.Course_ID
左连接仅匹配得A的记录,无匹配的课程会被保留,COUNT(B.Course_ID)会自动忽略NULL值,最终得到0的计数结果。
方法二:使用CASE语句统计符合条件的记录
SELECT A.Title, COUNT(CASE WHEN B.Grades = 'A' THEN 1 END) AS [Number of A's] FROM Courses A LEFT JOIN Grades B ON A.Course_ID = B.Course_ID GROUP BY A.Title, A.Course_ID ORDER BY A.Course_ID
先保留所有课程的成绩记录,通过CASE仅标记得A的情况,不满足条件时CASE返回NULL,COUNT会自动忽略这些NULL值,最终得到正确的得A人数统计。
注:GROUP BY中加入A.Course_ID是为了避免不同课程出现同名Title时的分组错误,同时保证ORDER BY能正常按课程ID排序。
内容的提问来源于stack exchange,提问作者user1500538
相关产品推荐
相关产品推荐

