2013-03-27 93 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