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;
运行这段代码会得到每个学生的最终出错状态,对应示例数据的结果是:
| ID | Student_Error |
|---|---|
| 1 | No |
| 2 | Yes |
| 3 | Yes |
| 4 | Yes |
第二步:统计最终结果
基于第一步的结果,分组统计数量和占比,用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为实际表名后,运行代码会得到和你期望一致的结果:
| Error | Count | Percent |
|---|---|---|
| Yes | 3 | 0.75 |
| No | 1 | 0.25 |
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

