2013-03-27 50 views
2

我有保持基於三類學生的成績表。有五個等級(A,B,C,d,e)每一類別,所以表看起來是這樣的:SQL多重數查詢

id | cat1 | cat2 | cat3 
1  A  B  A 
2  D  C  D 
3  B  A  E 
4  C  B  D 

我有一個列出的成績第二個表

grade 
    A 
    B 
    C 
    D 
    E 

我需要能夠對這些數據運行一個查詢,這樣我可以計算每種類別中,每個等級達到等級的數量。事情是這樣的:

Cat1 | Cat2 | Cat 3 
A  1  1  1 
B  1  2  0 
C  1  1  0 
D  1  0  2 
E  0  0  1 

我已經跑下面的查詢,我知道是不正確的,但產生接近結果預計:

SELECT g.grade, COUNT(mb.cat1) , COUNT(mb.cat2) , COUNT(mb.cat3) 
FROM markbook mb, grades g 
WHERE g.grade = mb.cat1 
GROUP BY g.grade 

回答

2

嘗試:

SELECT g.grade, 
     COUNT(case mb.cat1 when g.grade then 1 end), 
     COUNT(case mb.cat2 when g.grade then 1 end), 
     COUNT(case mb.cat3 when g.grade then 1 end) 
FROM markbook mb 
cross join grades g 
GROUP BY g.grade 

( SQLFiddle here

+0

優秀 - 這似乎工作。謝謝! – amburnside 2013-03-27 16:13:02

+0

@amburnside:不客氣。 – 2013-03-27 16:13:27

2

雖然我知道答案已經被摘下來,我的方式WOU LD已經走了,這將是使用LEFT JOIN,因此,如果一個檔次的火柴它仍然會出現。舉例如下:

SELECT 

    g.grade, 
    SUM(CASE mb.cat1 WHEN g.grade THEN 1 ELSE 0 END) AS cat1, 
    SUM(CASE mb.cat2 WHEN g.grade THEN 1 ELSE 0 END) AS cat2, 
    SUM(CASE mb.cat3 WHEN g.grade THEN 1 ELSE 0 END) AS cat3 

FROM grades g 
LEFT JOIN markbook mb 
    ON g.grade IN (mb.cat1,mb.cat2,mb.cat3) 
GROUP BY g.grade; 

(SQL小提琴例如,架構馬克扶手答案借:http://sqlfiddle.com/#!2/9b863/1

+1

使用交叉的加入我的查詢確保不匹配的等級仍然會出現在我的,太 - 看到http://sqlfiddle.com/#!2/9b863/2。 – 2013-03-27 16:22:36

+0

我明白了,我還以爲它會表現得更像INNER JOIN。那麼,你每天都會學到新的東西:)這種查詢從來沒有真正出現在我傾向於做的事情上。 – 2013-03-27 16:29:03