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

SQL技术问询:如何统计存在至少一次作业错误的学生数量?

解决SQL统计需求:按学生是否出错统计数量与占比

需求分析

需要统计至少有一门科目作业出错的学生数量:

  • 学生只要有一次作业出错,归为Yes
  • 所有作业都无错误,归为No
    最终按Yes/No分组统计学生数和占比。

分步实现SQL

第一步:确定每个学生的最终出错状态

先按学生ID分组,判断该学生是否存在作业出错的情况:

SELECT 
    ID,
    -- 只要有一次Yes,MAX后得到1,标记为Yes;否则为No
    CASE WHEN MAX(CASE WHEN Error = 'Yes' THEN 1 ELSE 0 END) = 1 THEN 'Yes' ELSE 'No' END AS Student_Error
FROM your_table_name
GROUP BY ID;

运行这段代码会得到每个学生的最终出错状态,对应示例数据的结果是:

IDStudent_Error
1No
2Yes
3Yes
4Yes

第二步:统计最终结果

基于第一步的结果,分组统计数量和占比,用CTE(公共表表达式)写法更清晰:

WITH student_error_status AS (
    SELECT 
        ID,
        CASE WHEN MAX(CASE WHEN Error = 'Yes' THEN 1 ELSE 0 END) = 1 THEN 'Yes' ELSE 'No' END AS Error
    FROM your_table_name
    GROUP BY ID
)
SELECT 
    Error,
    COUNT(*) AS Count,
    -- 计算占比,保留两位小数
    ROUND(COUNT(*) / (SELECT COUNT(*) FROM student_error_status), 2) AS Percent
FROM student_error_status
GROUP BY Error
-- 按Error降序排列,和示例输出一致
ORDER BY Error DESC;

也可以用子查询写法(无需CTE支持的数据库适用):

SELECT 
    Error,
    COUNT(*) AS Count,
    ROUND(COUNT(*) / (SELECT COUNT(DISTINCT ID) FROM your_table_name), 2) AS Percent
FROM (
    SELECT 
        ID,
        CASE WHEN MAX(CASE WHEN Error = 'Yes' THEN 1 ELSE 0 END) = 1 THEN 'Yes' ELSE 'No' END AS Error
    FROM your_table_name
    GROUP BY ID
) AS student_errors
GROUP BY Error
ORDER BY Error DESC;

示例运行结果

替换your_table_name为实际表名后,运行代码会得到和你期望一致的结果:

ErrorCountPercent
Yes30.75
No10.25

内容的提问来源于stack exchange,提问作者J.Sabree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:18