SQL 分组依据和计数科目的成绩总计

标签 sql

我还没有找到与我想做的事情完全匹配的答案。

说实话,我并不完全确定如何去做!

我有一个表格,其中包含学生在每个科目中取得的成绩:

student course grades

我想要一个表格,显示每个科目的成绩分布,每个成绩的总和:

student course grades

到目前为止我的查询是:

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/

相关文章:

mysql - SQL 根据另一个表中的相同表单元格更新表单元格

sql - access sql 查询中的 YES/NO 字段类型是什么?

sql - 优化 PostgreSQL 中的 SQL 查询

c# - 从 C# 将数据库名称作为变量传递给 SQL。是否可以?

mysql - #1064 SQL 语法错误

sql - 如何匹配复合类型数组中的元素?

sql - Oracle 查询不返回空值

sql - 情况下的SQL RAISERROR

sql - 复杂的检查约束?

mysql - 带有父子项的分层 SQL 查询