简体   繁体   English

SQL多次计数查询

[英]SQL multiple Count Query

I have a table which holds grades of students based on three categories. 我有一张桌子,可根据三个类别保存学生的成绩。 There are five grades (A,B,C,D,E) per category, so the table looks something like this: 每个类别有五个等级(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

etc 等等

I have a second table that list the grades 我还有第二张表列出成绩

grade
  A
  B
  C
  D
  E

I need to be able to run a query on this data so that I can count the number of grades achieved in each category for each grade. 我需要能够对此数据进行查询,以便我可以计算每个年级在每个类别中达到的年级数。 Something like this: 像这样:

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

I have ran the following query, which I know is not correct, but is yielding results close to expected: 我运行了以下查询,我知道这是不正确的,但是产生的结果接近预期:

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

Try: 尝试:

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 ) (SQLFiddle 在这里

While I know an answer has been picked already, the way I would have gone for this would be to use LEFT JOIN, so that if a grade had no matches it would still show up. 虽然我知道已经选择了一个答案,但我为此打算使用LEFT JOIN,这样,如果某个成绩没有匹配项,它仍然会显示出来。 Example as follows: 示例如下:

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 example, schema borrowed from Mark Bannisters answer : http://sqlfiddle.com/#!2/9b863/1 ) (SQL小提琴示例,从Mark Ba​​nnisters答案借来的架构: http ://sqlfiddle.com/#!2/9b863/1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM