
[英]SQL COUNT items and GROUP over multiple categories with 0 totals for missing entries
[英]SQL group by and count for grade totals over subjects
我还没有找到一个完全符合我想要的答案的答案。
老实说,我不太确定该怎么做!
我有一张表格,列出各学科的学生取得的成绩:
我想要一张表格,该表格显示每个科目的成绩分布情况,以及每个授予的成绩总数:
到目前为止,我的查询是:
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
依据group by
,但subjectcode
进行排序,这没有意义。 大多数数据库甚至都不允许这样做。 case
没有else
子句,因此不匹配将产生NULL
。 declare @grades table(result_id int identity, upn int, grade varchar(2), subjectcode varchar(2))
insert into @grades (upn,grade,subjectcode) values
(1,'D','Ar'),
(1,'A','Bi'),
(1,'C','Ch'),
(2,'A*','Ar'),
(2,'B','Ch'),
(2,'A*','PE'),
(3,'C','Ar'),
(3,'C','Ph'),
(3,'A','Bi')
SELECT subjectcode,
ISNULL(SUM(CASE WHEN grade = 'A*' THEN 1 END),'') 'A*',
ISNULL(SUM(CASE WHEN grade = 'A' THEN 1 END),'') A,
ISNULL(SUM(CASE WHEN grade = 'B' THEN 1 END),'') B,
ISNULL(SUM(CASE WHEN grade = 'C' THEN 1 END),'') C,
ISNULL(SUM(CASE WHEN grade = 'D' THEN 1 END),'') D,
ISNULL(SUM(CASE WHEN grade = 'E' THEN 1 END),'') E,
ISNULL(SUM(CASE WHEN grade = 'F' THEN 1 END),'') F,
ISNULL(SUM(CASE WHEN grade = 'G' THEN 1 END),'') G,
ISNULL(SUM(CASE WHEN grade = 'U' THEN 1 END),'') U,
ISNULL(SUM(CASE WHEN grade = 'X' THEN 1 END),'') X
FROM @grades
GROUP BY subjectcode
ORDER BY subjectcode ASC;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.