如何在SQLite中结合COUNT、GROUP BY与CASE统计各字母等级学生数
问题分析
你的查询结果不正确的核心原因是:SELECT子句包含了未聚合且未在GROUP BY中的列(name、number_grade、percent_completed)。当按letter_grade分组时,数据库无法确定这些列应取分组内的哪一个值,最终返回的是随机选取的单条学生数据,同时COUNT(number_grade)的统计逻辑也因无关列的干扰无法正确反映各等级的学生总数。
正确查询方法
你只需要保留字母等级和对应的统计数量即可,以下两种方案都能实现需求:
方案一:子查询先计算等级再分组统计
SELECT letter_grade, COUNT(*) AS num_of_students FROM ( SELECT CASE WHEN number_grade >= 90 THEN 'A' WHEN number_grade >= 80 THEN 'B' WHEN number_grade >= 70 THEN 'C' WHEN number_grade >= 60 THEN 'D' ELSE 'F' END AS letter_grade FROM student_grades ) AS grade_groups GROUP BY letter_grade ORDER BY letter_grade;
方案二:直接在主查询中用CASE表达式分组(更简洁)
SELECT CASE WHEN number_grade >= 90 THEN 'A' WHEN number_grade >= 80 THEN 'B' WHEN number_grade >= 70 THEN 'C' WHEN number_grade >= 60 THEN 'D' ELSE 'F' END AS letter_grade, COUNT(*) AS num_of_students FROM student_grades GROUP BY letter_grade ORDER BY letter_grade;
关键说明
- 使用
COUNT(*)统计分组行数比COUNT(number_grade)更稳妥:如果number_grade存在NULL值,COUNT(number_grade)会忽略这些行,而COUNT(*)会统计所有学生(除非你明确要排除分数为空的学生)。 - 新增
ORDER BY letter_grade可以让结果按A-F的逻辑顺序排列,可读性更强。 - 移除了
name、number_grade等单个学生的信息,因为你的需求是统计各等级的学生数量,这些字段属于冗余数据。
内容的提问来源于stack exchange,提问作者Colton
相关产品推荐
相关产品推荐

