2014-09-19 21 views
1

我還沒有設法找到一個與我正在嘗試做的完全匹配的答案。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; 

任何意見或建議,將不勝感激。

謝謝。

+1

您可以通過腳本或SQLFiddle提供模式和數據示例嗎? – Horaciux 2014-09-19 14:37:54

+0

或者更好 - 一個[sqlfiddle](http://sqlfiddle.com)。 – Mureinik 2014-09-19 14:39:47

+0

當然:[http://sqlfiddle.com/#!2/6200a/1](http://sqlfiddle.com/#!2/6200a/1) - 謝謝 – Jalfie 2014-09-19 14:42:27

回答

2

使用條件聚集,而不是多個子查詢:

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標準,應該用於字符串和日期常量。
  • 這被稱爲數據透視查詢,並且一些數據庫具有直接支持它們的語法。
+0

謝謝戈登 - 完全按照需要工作。歡呼的指針以及! – Jalfie 2014-09-19 15:10:34

0
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; 
+0

@jalfie你至少可以爲我的答案投票嗎?謝謝 – Horaciux 2014-09-24 00:59:34