表info,记录每个用户的每种操作,字段如下:
id
name
result
1
张三
A
2
李四
B
3
张三
C
4
王五
A
5
张三
A
6
张三
B
7
王五
C
8
李四
B
9
李四
B
10
张三
A
需求是分别统计出每个用户每种结果的次数,就算是0也也要有单独的一行记录,如下:
name
result
count
张三
A
3
张三
B
1
张三
C
1
李四
A
0
李四
B
3
李四
C
0
王五
A
1
王五
B
0
王五
C
1
PS:可以在上面的结果中增加每个用户的总操作数吗?就是这样:
name
result
count
张三
总操作
5
李四
总操作
3
王五
总操作
2
1、如果只是要【分别统计出每个用户每种结果的次数】,那只需要
这个应该是知道的。
2、但要求是【0也要有单独的一行记录】,那相当于要填充几条0的结果,可以通过join的笛卡尔积连接,实现所有可能,↓
select * from (select DISTINCT `name` from info)t1,(select DISTINCT result from info)t23、此时已经快接近结果了,只需将上面两个结果集进行左连接,再分组即可↓
select m.*,count(n.result) count from4、由于需要【增加每个用户的总操作数】,只需要在最后面加上with rollup即可,mysql里的一个关键字,专门用来分组统计,↓
select m.*,count(n.result) count from看到没,很接近结果了。
5、整理优化下,把最后一条总的统计过滤掉,总操作数加进去
select t.`name`,ifnull(t.result,'总操作') result,t.count
例如表名为sol ,根据表中的col1 列统计 sal字段的数据;
select sum(sal),col1
from sol t
group by col1
having sum(sal)=0 --在分组后加上统计结果为0的过滤条件就可以把数据筛选出来