博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL GROUP BY对多个字段进行分组
阅读量:4475 次
发布时间:2019-06-08

本文共 2144 字,大约阅读时间需要 7 分钟。

参考链接:http://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns

在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:

Table: Subject_SelectionSubject   Semester   Attendee--------------------------------- ITB001 1 John ITB001 1 Bob ITB001 1 Mickey ITB001 2 Jenny ITB001 2 James MKB114 1 John MKB114 1 Erica

我们想统计每门课程有多少个学生报名,应用如下SQL:

SELECT Subject, Count(*)FROM Subject_SelectionGROUP BY Subject

得到如下结果:

Subject    Count------------------------------ITB001     5 MKB114 2

因为表里记录了有5个学生选择ITB001,2个学生选择了MKB114。

产生这个结果的原因是:

GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。
那么GROUP BY X, Y呢?
GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

我们下面再接着要求统计出每门学科每个学期有多少人选择,应用如下SQL:

SELECT Subject, Semester, Count(*)FROM Subject_SelectionGROUP BY Subject, Semester

上面SQL的意思是,对Subject_Selection表中的数据进行分组,将具有相同Subject和Semester字段值的记录放到同一个分组里去, 然后对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)。

得到的结果是:

Subject    Semester   Count------------------------------ITB001     1 3 ITB001 2 2 MKB114 1 2

从表中的记录我们可以看出这个分组结果是正确的有3个学生在第一学期选择了ITB001, 2个学生在第二学期选择了ITB001,

还有两个学生在第一学期选择了MKB114, 没人在第二学期选择MKB114。

再比如有一个订单表,表中记录了所有支付过的订单

Table: OrderProduct   Buyer       Spending--------------------------------- PD001 Todd 12.00 PD001 Todd 12.00 PD001 Todd 12.00 PD001 Lily 12.00 PD001 Lily 12.00 PD002 Todd 20.00 PD002 Todd 20.00

现在我们想统计每个用户在每种商品上总共花了多少钱,执行如下SQL

SELECT Product,Buyer, SUM(Spending)FROM `Order` GROUP BY Product, Buyer

获得的结果如下:

Product    Buyer     SUM------------------------------PD001      Todd 36.00 PD001 Lily 24.00 PD002 Todd 40.00

总结:

在MYSQL中使用GROUP BY对表中的数据进行分组时,

GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里,
GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

HAVING

当然提到GROUP BY 我们就不得不提到HAVING,HAVING相当于条件筛选,但它与WHERE筛选不同,HAVING是对于GROUP BY对象进行筛选。

我们举个例子:
每个部门人数都有了,那如果我们想要进一步知道员工人数大于30000的部门是哪些,这个时候就得用到HAVING了。
语句如下:

SELECT    ( SELECT d.dept_name FROM departments d WHERE de.dept_no = d.dept_no ) AS 部门, count( de.emp_no ) AS 人数 FROM dept_emp de WHERE de.to_date = '9999-01-01' GROUP BY de.dept_no HAVING count( de.emp_no ) > 30000
结果
作者:Awesome_Tang
链接:https://www.jianshu.com/p/8b135d373df1

 

转载于:https://www.cnblogs.com/87060524test/p/10402784.html

你可能感兴趣的文章
flann matlab,FLANN 快速的(近似)最近邻开源库
查看>>
pmta linux视频,PowerMTA (PMTA) 的安装和设置方法 – 黄忠 – 博客
查看>>
2016秋季C语言程序设计试题,2016c语言程序设计模拟试题
查看>>
C语言编程初体验 作文,C语言作文件操常用代码
查看>>
rar for android去广告,安卓解压神器RAR v5.30.39 去广告版
查看>>
android p什么变化,Android P预览版,这些调整和变化最值得关注
查看>>
android 7.0宽度432,全球最小的4G手机,比手掌还小,安卓7.0
查看>>
android fragmentstatepageradapter框架,Android FragmentStatePagerAdapter
查看>>
html自适应meta标签,自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结...
查看>>
html怎么加入编辑器,HTML 编辑器
查看>>
python发挥程度_你为什么用 Python?
查看>>
file 选择的文件胖多有多大_「HTML5 进阶」FileAPI 文件操作实战,内附详细案例,建议收藏...
查看>>
玄惭 mysql_阿里云数据库专家玄惭的“武功”全记录之最佳实践、双十一特别篇...
查看>>
c mysql 时间段查询_mySql 时间段查询
查看>>
mysql sql乱码怎么解决_MYSQL数据库导入SQL文件出现乱码如何解决
查看>>
mysql的存储过程与事务_mysql的存储过程与事务入门
查看>>
java程序员闯关题网站_Java程序员每周必逛的十大学习网站
查看>>
python面试装饰器_Python测开面试题之装饰器
查看>>
flashcache mysql_flashcache的实现与分析
查看>>
linux shell 里面执行python 程序_Linux下编写脚本Shell和Python的区别?
查看>>