SQL多计数查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL多计数查询相关的知识,希望对你有一定的参考价值。
我有一张桌子,根据三个类别保存学生的成绩。每个类别有五个等级(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
答案
尝试:
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)
另一答案
虽然我已经知道答案已经被选中了,但我想要的方法是使用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 Bannisters借来的架构回答:http://sqlfiddle.com/#!2/9b863/1)
以上是关于SQL多计数查询的主要内容,如果未能解决你的问题,请参考以下文章
SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper
sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li