You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:12:07