mysql分组统计 显示统计为0的项

表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、如果只是要【分别统计出每个用户每种结果的次数】,那只需要

select name,result,count(1) count
  from info 
  group by name,result

这个应该是知道的。

2、但要求是【0也要有单独的一行记录】,那相当于要填充几条0的结果,可以通过join的笛卡尔积连接,实现所有可能,↓

select * from (select DISTINCT `name` from info)t1,(select DISTINCT result from info)t2

3、此时已经快接近结果了,只需将上面两个结果集进行左连接,再分组即可↓

select m.*,count(n.result) count from 
 (select * from (select DISTINCT `name` from info)t1,(select DISTINCT result from info)t2)m 
 left join 
 info n on m.`name`=n.`name` and m.result=n.result
 group by m.`name`,m.result

4、由于需要【增加每个用户的总操作数】,只需要在最后面加上with rollup即可,mysql里的一个关键字,专门用来分组统计,↓

select m.*,count(n.result) count from 
 (select * from (select DISTINCT `name` from info)t1,(select DISTINCT result from info)t2)m 
 left join 
 info n on m.`name`=n.`name` and m.result=n.result
 group by m.`name`,m.result
 with rollup

看到没,很接近结果了。

5、整理优化下,把最后一条总的统计过滤掉,总操作数加进去

select t.`name`,ifnull(t.result,'总操作') result,t.count 
 from (select m.*,count(n.result) count  
        from (select * from (select DISTINCT `name` from info)t1,(select DISTINCT result from info)t2)m 
          left join 
          info n on m.`name`=n.`name` and m.result=n.result
        group by m.`name`,m.result
        with rollup
      )t
 where t.name is not null

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-08-18
mysql分组统计 显示统计为0的项
可直接用嵌套查询。
方法如下:
如数据:
id name
1 a
1 b
2 c
2 d
3 e
3 f
3 g
3 h
select count(t.counts) from
(select id,count(*) counts from 表名 group by id) t
这样得到的结果就是3。本回答被网友采纳
第2个回答  2015-10-09
WITH 
a1 AS
(SELECT uname,count(uname) AS sl FROM #t1 WHERE urs='a' GROUP BY uname),
a2 AS 
(SELECT uname,count(uname) AS sl FROM #t1 WHERE urs='b' GROUP BY uname),
a3 AS 
(SELECT uname,count(uname) AS sl FROM #t1 WHERE urs='c' GROUP BY uname)
SELECT DISTINCT t.uname,'A' AS rs,isnull(a1.sl,0) AS sl FROM #t1 AS t LEFT JOIN a1 ON t.uname=a1.uname
UNION
SELECT DISTINCT t.uname,'B' AS rs,isnull(a2.sl,0) AS sl FROM #t1 AS t LEFT JOIN a2 ON t.uname=a2.uname
UNION
SELECT DISTINCT t.uname,'C' AS rs,isnull(a3.sl,0) AS sl FROM #t1 AS t LEFT JOIN a3 ON t.uname=a3.uname
UNION
SELECT uname,'I--->',count(uname) as sl FROM #t1 group by uname
ORDER BY t.uname
-------------------------------------
uname rs sl
李四 A 0
李四 B 3
李四 C 0
李四 I---> 3
王五 A 1
王五 B 0
王五 C 1
王五 I---> 2
张三 A 3
张三 B 1
张三 C 1
张三 I---> 5

本回答被网友采纳
第3个回答  2017-08-15
mysql分组统计 显示统计为0的项
可直接用嵌套查询。
方法如下:
如数据:
id name
1 a
1 b
2 c
2 d
3 e
3 f
3 g
3 h
select count(t.counts) from
(select id,count(*) counts from 表名 group by id) t
这样得到的结果就是3。
第4个回答  2017-07-14



例如表名为sol ,根据表中的col1 列统计 sal字段的数据;

select sum(sal),col1

from sol t

group by col1

having sum(sal)=0   --在分组后加上统计结果为0的过滤条件就可以把数据筛选出来

相似回答