有这样一个表数据:

学生姓名,学生手机号,上课日期,上课科目

科目分:

语文、数学、英语、计算机

要求统计一个这样子的结果:

学生姓名,学生手机号,第一次上课日期,迄今一共上了多少节课,上的最多的科目是,该科目一共上了几节

本来想着简单,那不就是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 和 聚合函数的使用的更多相关文章

  1. 关于GROUP BY和聚合函数

    可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...

  2. 可以这样去理解group by和聚合函数

    写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...

  3. group by 和聚合函数

    group by 的基本用法 group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计.在不同数据库中用法稍有不同,这里只测试mysql和oracle. ...

  4. 可以这样去理解group by和聚合函数(转)

    http://www.cnblogs.com/wuguanglei/p/4229938.html 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不 ...

  5. sql 学习之 group by 及 聚合函数

    1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SEL ...

  6. mysql概要(四)order by ,limit ,group by和聚合函数的特点,子查询

    1.order by 默认按升序排列(asc/desc),多字段排序 order by 字段 排序方式,字段2 排序方式,..: 在分组排序中,排序是对分组后的结果进行排序,而不是在组中进行排序. s ...

  7. group by 和 聚合函数

    1.在oracle中 select * from Table group by id 会报错. 会报不是group by 表达式.为什么一定不能是 * ,而必须是分组的列或者某个列的聚合函数. 在my ...

  8. GROUP BY 与聚合函数 使用注意点

    表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...

  9. 一文让你彻底理解group by和聚合函数

    知道group by是进行分组查询,但是一直觉得对其理解得不够透彻,在网上扒了一篇文章,我认为写得非常好. 为什么不能够select * from Table group by id,为什么一定不能是 ...

随机推荐

  1. HDU2819 Swap —— 二分图最大匹配

    题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  2. nginx性能优化技巧

    前几天买了本高俊峰的<高性能Linux服务器构建实战I>,网上都说运维必备手册,昨天看了目录加小50页感觉还是比较扩充视野的,很多东西在学校是不可能学到的,就是感觉有的地方讲的仍然不是很清 ...

  3. Android ConstraintLayout详解

    1. 概述 在本篇文章中,你会学习到有关ConstraintLayout -- 一种构建于弹性Constraints(约束)系统的新型Android Layout.最终你将会在Android Stud ...

  4. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

    几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floy ...

  5. linuxmint安装卡在探测文件系统,解决方法。

    今天安装linuxmint17.3,一直卡在探测文件... 解决方法如下: 执行安装程序前,打开终端执行如下命令即可. sudo umount -l /isodevic

  6. css模型

    外边距: margin:1px 2px 3px 4px; 上     右     下     左 内边距: padding:1px 2px 3px 4px; 上     右     下     左 边 ...

  7. tools:context=".MainActivity的作用 (转载)

    转自:http://blog.csdn.net/caiwenfeng_for_23/article/details/8373569 <TextView android:layout_width= ...

  8. jsp请求转发小例子(转载)

    在服务器端对客户端请求时行转发对其它的对象,如果jsp网页或Servlet 用三个 jsp网页来演示转发: forword1.jsp, 用来提交表单, 将表单内容提交给 forwrod2.jsp,  ...

  9. bzoj 3732: Network【克鲁斯卡尔+树链剖分】

    先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 #include<iostream> #include<cstdio&g ...

  10. bzoj 1407: [Noi2002]Savage【扩展欧几里得+中国剩余定理】

    首先答案不会很大,所以枚举答案m,于是把问题转为了判定: 关于如何判定: 首先题目中虽然没说但是数据是按照初始洞穴编号排的序,所以并不用自己重新再排 假设当前答案为m,相遇时间为x,野人i和j,那么可 ...