问题:
一个学生成绩表,里面有语文,数学,英语等类型成绩,用type=(0,1,2)表示,
求每一个学生分别参加过多少次语文,数学,英语,以及总共参加过多少次比赛,也就是要返回的列为:
学生id | 语文次数 | 数学次数 | 英语次数 | 总次数 |
---|
score表结构如下:
student_id | type | score |
---|---|---|
1 | 0 | 100 |
2 | 1 | 100 |
3 | 0 | 100 |
1 | 1 | 100 |
2 | 0 | 100 |
3 | 2 | 100 |
2 | 3 | 100 |
3 | 0 | 100 |
答案:
select
count(1) as 总次数,
count(case when score.type = 0 then 1 else null) as 语文次数,
count(case when score.type = 1 then 1 else null) as 数学次数,
count(case when score.type = 2 then 1 else null) as 英语次数
from score group by student_id;
原理:
case when (condition) then (value0) else (value1) 相当于临时新建一列,
查询语文的时候 condition是score.type = 0,满足这个条件该列取值为1,否则该列取值为null,对该列进行count操作,值为1的都会计算在内,值为null的都不会被count操作计算在内