group by 和 聚合函数的使用
有这样一个表数据:
学生姓名,学生手机号,上课日期,上课科目
科目分:
语文、数学、英语、计算机
要求统计一个这样子的结果:
学生姓名,学生手机号,第一次上课日期,迄今一共上了多少节课,上的最多的科目是,该科目一共上了几节
本来想着简单,那不就是group by一下,一个子查询l不就解决了,想法如下:
select 学生姓名,学生手机号,min(上课日期),上课科目,count(上课科目) as 该科目一共上了几节 form 表 group by 学生姓名,学生手机号,上课科目
以上面的查询结果 as 表2,继续查询:
select 学生姓名,学生手机号,min(上课日期),sum(该科目一共上了几节),max(该科目一共上了几节),上课科目 form 表2 group by 学生姓名,学生手机号
想着,觉得这个max能找到最大数字所在的行,那么顺带返回最大数字那一行的上课科目,结果就出来了。
但是实际运行的时候发现,非聚合项,不能直接查,得使用聚合函数,比如:
这里的 学生姓名,学生手机号 是聚合项,在select的时候可以直接查询,但是其他的非聚合项,得加上聚合函数,比如这里的 min 、sum 、max ,这些是可以的,
而这个 上课科目 非聚合项,也没有使用聚合函数,查询语句会报错,
想当然的以为会找到最大行对应的上课科目也是不对的,如果真是这样,那这句sql到底要返回 最小日期 行对应的 上课科目 还是应该返回 最大节数 对应的行里的 上课科目 呢?
不过据说呢mysql的语法是并不严谨的,是可以返回这个聚合函数找到的行的其他列数据,不过我并没有去尝试验证。 select 学生姓名,学生手机号,min(上课日期),sum(该科目一共上了几节),max(该科目一共上了几节),上课科目 form 表2 group by 学生姓名,学生手机号
看来偷懒是偷不了了,只好规规矩矩的写,3级子查询:
这是一个查询基表 as 表2
select 学生姓名,学生手机号,min(上课日期) as 单科最小日期,上课科目,count(上课科目) as 单科节数 form 表 group by 学生姓名,学生手机号,上课科目
在基表的基础上 as 表3
select 学生姓名,学生手机号,min(单科最小日期) as 最小日期,sum(单科节数) as 总节数,max(单科节数) as 最大节数 form 表2 group by 学生姓名,学生手机号 在两个子查询的基础上再查询,挑出最大节数的数据行,当然,这个最大节数的不一定是单单一个科目,比如,语文、数学都是21节,都是最大节数,那么这个学生就会返回两行结果
select aaa.学生姓名,aaa. 学生手机号,bbb. 最小日期,bbb. 总节数,aaa. 上课科目,aaa. 单科节数 form 表2 as aaa left join 表3 as bbb
on aaa. 学生姓名=bbb. 学生姓名 and aaa. 学生手机号=bbb. 学生手机号 and aaa. 单科节数=bbb. 最大节数
来看个实例:
数据:

查询代码:
Private Sub 汇总数据()
Dim Con As Object, rs As Object
Set Con = CreateObject("ADODB.Connection")
Con.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;hdr=no;imex=1';Data Source=" & ActiveWorkbook.FullName
Dim sql As String, t As String
t = "" & "$"
Dim table1 As String, table2 As String
' 同一个人,同一门课,最小日期,上课次数
table1 = " SELECT f1, f2, min(f3) as min_f3, f4, count(1) as f4_count from [" & t & "] group by f1,f2,f4 "
' 同一个人,最小日期,上最多的次数,一共上多少次课
table2 = " select f1, f2, min(min_f3) as min_rq, max(f4_count) as f4_max, sum(f4_count) as f4_sum from (" & table1 & ") group by f1,f2 "
' 姓名 电话 首次上课时间 总上课次数 上得最多的课程(, where left join on 两种方式都是可以的)
sql = " SELECT distinct a.f1, a.f2, b.min_rq, b.f4_sum, a.f4, a.f4_count from (" & table2 & ") as b, (" & table1 & ") as a "
sql = sql & " WHERE a.f1 = b.f1 and a.f2 = b.f2 and a.f4_count = b.f4_max "
' sql = " SELECT distinct a.f1, a.f2, b.min_rq, b.f4_sum, a.f4, a.f4_count from (" & table2 & ") as b left join (" & table1 & ") as a "
' sql = sql & " on a.f1 = b.f1 and a.f2 = b.f2 and a.f4_count = b.f4_max "
Set rs = Con.Execute(sql)
Sheets.Add After:=Sheets(Sheets.Count)
For i = To rs.fields.Count -
Cells(, i + ) = rs.fields(i).Name
Next
Cells(, ).CopyFromRecordset rs
rs.Close: Set rs = Nothing
Con.Close: Set Con = Nothing
End Sub
结果:

group by 和 聚合函数的使用的更多相关文章
- 关于GROUP BY和聚合函数
可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...
- 可以这样去理解group by和聚合函数
写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...
- group by 和聚合函数
group by 的基本用法 group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计.在不同数据库中用法稍有不同,这里只测试mysql和oracle. ...
- 可以这样去理解group by和聚合函数(转)
http://www.cnblogs.com/wuguanglei/p/4229938.html 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不 ...
- sql 学习之 group by 及 聚合函数
1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SEL ...
- mysql概要(四)order by ,limit ,group by和聚合函数的特点,子查询
1.order by 默认按升序排列(asc/desc),多字段排序 order by 字段 排序方式,字段2 排序方式,..: 在分组排序中,排序是对分组后的结果进行排序,而不是在组中进行排序. s ...
- group by 和 聚合函数
1.在oracle中 select * from Table group by id 会报错. 会报不是group by 表达式.为什么一定不能是 * ,而必须是分组的列或者某个列的聚合函数. 在my ...
- GROUP BY 与聚合函数 使用注意点
表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...
- 一文让你彻底理解group by和聚合函数
知道group by是进行分组查询,但是一直觉得对其理解得不够透彻,在网上扒了一篇文章,我认为写得非常好. 为什么不能够select * from Table group by id,为什么一定不能是 ...
随机推荐
- web项目开发 之 前端规范 --- HTML编码规范
此文严格按照W3C规范和部分实际项目可读性,浏览器加载,性能等众多属性权衡,做出平时前端编码规范文 档.供广大web工作者参考并实施,对维护和项目扩展升级都能省时省力. 转载请注明出处,JS前端实用开 ...
- 一步一步学Silverlight 2系列(3):界面布局
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 苹果Instruments/Shark性能调试工具概述
在Mac OS X上你可以使用Gprof这样的UNIX工具用于测试程序性能.当然,Apple也有自己的Profiling Tools,用得比较多的是Shark.10.5里还引入了一个基于DTrace的 ...
- Ubuntu TFTP 服务
/******************************************************************** * Ubuntu TFTP 服务 * 说明: * 在Ubun ...
- BZOJ_1670_[Usaco2006 Oct]Building the Moat护城河的挖掘_求凸包
BZOJ_1670_[Usaco2006 Oct]Building the Moat护城河的挖掘_求凸包 Description 为了防止口渴的食蚁兽进入他的农场,Farmer John决定在他的农场 ...
- silverlight 子UserControl获取父UserControl
文章转载自: [Silverlight] Silverlight中访问父对象 http://bbs.blueidea.com/thread-2964806-1-1.html 当前一个需求是一个User ...
- 微型ORM:PetaPoco 学习资料整理
github地址:https://github.com/CollaboratingPlatypus/PetaPoco petapoco 实体中字段去掉关联(类似于EF中的NotMap) 微型ORM:P ...
- ubuntu12.04中极品五笔简体繁体切换
不小心切换成了繁体,按Ctrl+:,可以切换回来.
- Hibernate对集合属性的操作---基础学习
1:Set集合属性操作 1).Hibernate3以后支持大部分重要的JDK集合接口映射,Set集合接口的配置: >在xxx.hbm.xml文件中使用<set>标签 2).< ...
- 一个 Java 对象到底有多大?
阅读本文大概需要 2.8 分钟. 出处:http://u6.gg/swLPg 编写 Java 代码的时候,大多数情况下,我们很少关注一个 Java 对象究竟有多大(占据多少内存),更多的是关注业务与逻 ...