【问题标题】:SQL multiple Count QuerySQL 多重计数查询
【发布时间】:2013-03-27 15:57:20
【问题描述】:

我有一个表格,其中包含基于三个类别的学生成绩。每个类别有五个等级(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

【问题讨论】:

    标签: php mysql sql count


    【解决方案1】:

    试试:

    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)

    【讨论】:

      【解决方案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 fiddle 示例,从 Mark Ba​​nnisters 借用的架构答案:http://sqlfiddle.com/#!2/9b863/1

      【讨论】:

      • 在我的查询中使用交叉连接可确保我的查询中仍会出现不匹配的成绩 - 请参阅sqlfiddle.com/#!2/9b863/2
      • 我明白了,我认为它的行为更像是 INNER JOIN。好吧,你每天都会学到一些新东西 :) 这种查询从未真正出现在我经常做的事情中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多