我还没有找到与我想做的事情完全匹配的答案。
说实话,我并不完全确定如何去做!
我有一个表格,其中包含学生在每个科目中取得的成绩:
我想要一个表格,显示每个科目的成绩分布,每个成绩的总和:
到目前为止我的查询是:
SELECT subjectcode,
(SELECT COUNT(grade) FROM results WHERE grade = "A") as A,
(SELECT COUNT(grade) FROM results WHERE grade = "B") as B,
(SELECT COUNT(grade) FROM results WHERE grade = "C") as C,
(SELECT COUNT(grade) FROM results WHERE grade = "D") as D,
(SELECT COUNT(grade) FROM results WHERE grade = "E") as E
FROM results
GROUP BY grade
ORDER BY subjectcode ASC;
如有任何意见或建议,我们将不胜感激。
谢谢。
最佳答案
使用条件聚合,而不是多个子查询:
SELECT subjectcode,
SUM(CASE WHEN grade = 'A' THEN 1 END) as A,
SUM(CASE WHEN grade = 'B' THEN 1 END) as B,
SUM(CASE WHEN grade = 'C' THEN 1 END) as C,
SUM(CASE WHEN grade = 'D' THEN 1 END) as D,
SUM(CASE WHEN grade = 'E' THEN 1 END) as E
FROM results
GROUP BY subjectcode
ORDER BY subjectcode ASC;
注释:
group by
子句已修复。您在group by
中有grade
,但却按subjectcode
排序,这是没有意义的。这在大多数数据库中甚至是不允许的。case
上没有else
子句,因此不匹配会产生NULL
。- 字符串常量由单引号而不是双引号分隔。单引号是 ANSI 标准,应用于字符串和日期常量。
- 这称为数据透视查询,某些数据库具有直接支持它们的语法。
关于SQL 分组依据和计数科目的成绩总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936400/