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,为什么一定不能是 ...
随机推荐
- Linux 杀死所有进程
方法一: sudo killall -9 netease-cloud-music 这种方法,必须要写全称. sudo netease-cloud-music QStandardPaths: XDG_R ...
- Atom vim mode
/******************************************************************** * Atom vim mode * 说明: * 想找一个具有 ...
- BZOJ2049:Cave 洞穴勘测 (LCT入门)
辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可 ...
- 学习笔记::AC自动机
最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有 ...
- 关于spring cloud eureka整合ribbon实现客户端的负载均衡
1. 实现eureka整合ribbon非常简单, 1.1.首先引入所需maven依赖 <dependency> <groupId>org.springframework.boo ...
- Java多线程系列七——ExecutorService
java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...
- Android中string.xml中的的标签xliff:g(转载)
转自:http://blog.csdn.net/xuewater/article/details/25687987 在资源文件中写字符串时,如果这个字符串时动态的,又不确定的值在里面,我们就可以用xl ...
- 哈理工OJ P2320:OX
题目链接:OX 题意 :给出一个3X3的黑白棋棋盘,棋盘上有若干黑白子,再给出下一个下的人,问下一个下的人能否赢 分析:考虑到只有39种状态,故用一个数保存目前棋盘的状态,记为value,再枚举空位D ...
- bzoj 2288: 【POJ Challenge】生日礼物【链表+堆】
参考:http://blog.csdn.net/w_yqts/article/details/76037315 把相同符号的连续数字加起来,合并后ans先贪心的加上所有正数,如果正数个数sum> ...
- centos6.5 系统-搭建lamp(php7)环境--(yum在线安装)
1.查看当前服务器的版本 #方法1 cat /etc/redhat-release #方法2 rpm -q centos-release 2.安装apache #一键安装apache yum inst ...