2013-03-27 6 views
2

나는 세 가지 범주에 기초하여 학생들의 성적을 유지하는 테이블을 가지고있다. 다섯 개 등급 (A는, B는 C, D, E) 카테고리 당, 그래서 표는이 같은 모양이 있습니다SQL multiple Count Query

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

+0

@amburnside : 천만에. –

2

답변이 이미 선택되었음을 알고 있지만, 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; 

(막 Bannisters 대답에서 차용 SQL 바이올린 예를 들어, 스키마 http://sqlfiddle.com/#!2/9b863/1)

+1

내 쿼리에서 교차 조인을 사용하면 일치 항목이없는 성적이 여전히 내지면에도 표시됩니다 (http://sqlfiddle.com/#!2/9b863/2 참조). –

+0

나는 INNER JOIN처럼 행동했을 것이라고 생각했다. 자, 여러분은 매일 새로운 것을 배웁니다. 이런 종류의 질의는 제가하는 일에 정말로 잘 빠지지 않았습니다. –