Mysql分组查询group by与with rollup方式
Mysql分组查询group by与with rollup
当用select*from 表名 group by‘字段名1’将选出来的内容将按照字段1分组,其他列不尽相同,会以最前面的内容显示:

GROUP BY 后面可以跟多个列名,表示以多列作为分组依据:
mysql> select `name`,`date`,count(*) from `employee_tbl` group by `name`,date; +------+---------------------+----------+ | name | date | count(*) | +------+---------------------+----------+ | 小丽 | 2016-04-19 15:26:02 | 1 | | 小明 | 2016-04-04 15:26:54 | 1 | | 小明 | 2016-04-11 15:26:40 | 1 | | 小明 | 2016-04-22 15:25:33 | 1 | | 小王 | 2016-04-07 15:26:14 | 1 | | 小王 | 2016-04-20 15:25:47 | 1 | +------+---------------------+----------+ 6 rows in set (0.05 sec)
group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计(在每个分组下都会有统计汇总):
mysql> select*from r; +------+-----+------+ | name | cat | fish | +------+-----+------+ | 小明 | x | 1 | | 小明 | x | 2 | | 小明 | x | 4 | | 小明 | y | 2 | | 小明 | y | 2 | | 小明 | z | 1 | | 小红 | x | 1 | | 小红 | x | 3 | | 小红 | y | 1 | | 小红 | y | 2 | | 小青 | y | 3 | | 小青 | z | 2 | | 小青 | z | 1 | +------+-----+------+ 13 rows in set (0.05 sec) mysql> select name,cat,fish,count(*) from r group by name with rollup; +------+-----+------+----------+ | name | cat | fish | count(*) | +------+-----+------+----------+ | 小红 | x | 1 | 4 | | 小明 | x | 1 | 6 | | 小青 | y | 3 | 3 | | NULL | y | 3 | 13 | +------+-----+------+----------+ 4 rows in set (0.05 sec) mysql> select name,cat,fish,count(*) from r group by name,cat with rollup; +------+------+------+----------+ | name | cat | fish | count(*) | +------+------+------+----------+ | 小红 | x | 1 | 2 | | 小红 | y | 1 | 2 | | 小红 | NULL | 1 | 4 | | 小明 | x | 1 | 3 | | 小明 | y | 2 | 2 | | 小明 | z | 1 | 1 | | 小明 | NULL | 1 | 6 | | 小青 | y | 3 | 1 | | 小青 | z | 2 | 2 | | 小青 | NULL | 2 | 3 | | NULL | NULL | 2 | 13 | +------+------+------+----------+ 11 rows in set (0.06 sec) mysql> select name,cat,fish,count(*) from r group by name,cat,fish with rollup; +------+------+------+----------+ | name | cat | fish | count(*) | +------+------+------+----------+ | 小红 | x | 1 | 1 | | 小红 | x | 3 | 1 | | 小红 | x | NULL | 2 | | 小红 | y | 1 | 1 | | 小红 | y | 2 | 1 | | 小红 | y | NULL | 2 | | 小红 | NULL | NULL | 4 | | 小明 | x | 1 | 1 | | 小明 | x | 2 | 1 | | 小明 | x | 4 | 1 | | 小明 | x | NULL | 3 | | 小明 | y | 2 | 2 | | 小明 | y | NULL | 2 | | 小明 | z | 1 | 1 | | 小明 | z | NULL | 1 | | 小明 | NULL | NULL | 6 | | 小青 | y | 3 | 1 | | 小青 | y | NULL | 1 | | 小青 | z | 1 | 1 | | 小青 | z | 2 | 1 | | 小青 | z | NULL | 2 | | 小青 | NULL | NULL | 3 | | NULL | NULL | NULL | 13 | +------+------+------+----------+ 23 rows in set (0.07 sec) mysql> select name,cat,fish,sum(fish) from r group by name with rollup; +------+-----+------+-----------+ | name | cat | fish | sum(fish) | +------+-----+------+-----------+ | 小红 | x | 1 | 7 | | 小明 | x | 1 | 12 | | 小青 | y | 3 | 6 | | NULL | y | 3 | 25 | +------+-----+------+-----------+ 4 rows in set (0.05 sec) mysql> select name,cat,fish,sum(fish) from r group by name,cat with rollup; +------+------+------+-----------+ | name | cat | fish | sum(fish) | +------+------+------+-----------+ | 小红 | x | 1 | 4 | | 小红 | y | 1 | 3 | | 小红 | NULL | 1 | 7 | | 小明 | x | 1 | 7 | | 小明 | y | 2 | 4 | | 小明 | z | 1 | 1 | | 小明 | NULL | 1 | 12 | | 小青 | y | 3 | 3 | | 小青 | z | 2 | 3 | | 小青 | NULL | 2 | 6 | | NULL | NULL | 2 | 25 | +------+------+------+-----------+ 11 rows in set (0.06 sec) mysql> select name,cat,fish,sum(fish) from r group by name,cat,fish with rollup; +------+------+------+-----------+ | name | cat | fish | sum(fish) | +------+------+------+-----------+ | 小红 | x | 1 | 1 | | 小红 | x | 3 | 3 | | 小红 | x | NULL | 4 | | 小红 | y | 1 | 1 | | 小红 | y | 2 | 2 | | 小红 | y | NULL | 3 | | 小红 | NULL | NULL | 7 | | 小明 | x | 1 | 1 | | 小明 | x | 2 | 2 | | 小明 | x | 4 | 4 | | 小明 | x | NULL | 7 | | 小明 | y | 2 | 4 | | 小明 | y | NULL | 4 | | 小明 | z | 1 | 1 | | 小明 | z | NULL | 1 | | 小明 | NULL | NULL | 12 | | 小青 | y | 3 | 3 | | 小青 | y | NULL | 3 | | 小青 | z | 1 | 1 | | 小青 | z | 2 | 2 | | 小青 | z | NULL | 3 | | 小青 | NULL | NULL | 6 | | NULL | NULL | NULL | 25 | +------+------+------+-----------+ 23 rows in set (0.07 sec)

Mysql分组查询统计每个选项的数量
帮客户做个问卷调查,最后需要统计每道问题的每个选项的数量。
思路是先按问题分组,然后使用case语句区分每个选项,然后做统计。
SQL语句如下:
SELECT examQuestionId, SUM(CASE WHEN answer='非常同意' then 1 else 0 end) as '非常同意', SUM(CASE WHEN answer='有点同意' then 1 else 0 end) as '有点同意', SUM(CASE WHEN answer='中立' then 1 else 0 end) as '中立', SUM(CASE WHEN answer='有点不同意' then 1 else 0 end) as '有点不同意', SUM(CASE WHEN answer='非常不同意' then 1 else 0 end) as '非常不同意' FROM bm_exam_paper_question GROUP BY examQuestionId ORDER BY examQuestionId
执行效果如下:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
python中response.text 和response.content的区别详解
这篇文章主要介绍了python中response.text 和response.content的区别详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-05-05
Python数据分析matplotlib设置多个子图的间距方法
今天小编就为大家分享一篇Python数据分析matplotlib设置多个子图的间距方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-08-08
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
这篇文章主要介绍了利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-11-11
一篇文章彻底弄懂Python中的if __name__ == __main__
在Python当中如果代码写得规范一些,通常会写上一句if '__name__'=='__main__:'作为程序的入口,下面这篇文章主要给大家介绍了关于如何通过一篇文章彻底弄懂Python中的if __name__ == __main__的相关资料,需要的朋友可以参考下2022-12-12
Pandas DataFrame中的tuple元素遍历的实现
这篇文章主要介绍了Pandas DataFrame中的tuple元素遍历的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-10-10


最新评论