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

表info,记录每个用户的每种操作,字段如下:idnameresult1张三A2李四B3张三C4王五A5张三A6张三B7王五C8李四B9李四B10张三A需求是分别统计出每... 表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
展开
 我来答
abul阿宝
2017-08-15 · TA获得超过260个赞
知道小有建树答主
回答量:192
采纳率:0%
帮助的人:176万
展开全部

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

匿名用户
推荐于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。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
嗬哟嗬哟拔萝卜
2015-10-09 · 超过74用户采纳过TA的回答
知道小有建树答主
回答量:164
采纳率:100%
帮助的人:99.6万
展开全部
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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
弥访冬6x
2017-07-14 · TA获得超过361个赞
知道小有建树答主
回答量:276
采纳率:100%
帮助的人:60.1万
展开全部



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

select sum(sal),col1

from sol t

group by col1

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式