SQL多计数查询

时间:2013-03-27 15:57:20

标签: php mysql sql count

我有一张桌子,根据三个类别保存学生的成绩。每个类别有五个等级(A,B,C,D,E),所以表格看起来像这样:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

(SQL小提琴示例,借用Mark Ba​​nnisters的模式回答:http://sqlfiddle.com/#!2/9b863/1