group by 使用 rollup 子句总结

一、如何理解group by 带 rollup 子句所产生的效果

group by 后带 rollup 子句的功能可以理解为:先按一定的规则产生多种分组,然后按各种分组统计数据(至于统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函数)。因此要搞懂group by 后带 rollup 子句的用法主要是搞懂它是如何按一定的规则产生多种分组的group by 带 rollup 子句所返回的结果集,可以理解为各个分组所产生的结果集的并集且没有去掉重复数据。下面举例说明:

1、 对比没有带rollup 的goup by

例:Group by  A ,B

产生的分组种数:1种;

即group by  A,B

返回结果集:也就是这一种分组的结果集。

2、 带rollup 但 group by 与 rollup 之间没有任何内容

例1:Group by  rollup(A ,B)

产生的分组种数:3 种;

第一种:group by  A,B

第二种:group by  A

第三种:group by  NULL

(说明:本没有group by  NULL  的写法,在这里指是为了方便说明,而采用之。含义是:没有分组,也就是所有数据做一个统计。例如聚合函数是SUM的话,那就是对所有满足条件的数据进行求和。此写法的含义下同)

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by  rollup(A ,B,C)

产生的分组种数:4 种;

第一种:group by  A,B,C

第二种:group by  A,B

第三种:group by  A

第四种:group by  NULL

返回结果集:为以上四种分组统计结果集的并集且未去掉重复数据。

3、 带rollup 但 group by 与 rollup 之间还包含有列信息

例1:Group by  A , rollup(A ,B)

产生的分组种数:3 种;

第一种:group by  A,A,B     等价于 group by  A,B

第二种:group by  A,A       等价于 group by  A

第三种:group by  A,NULL   等价于 group by  A

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by  C , rollup(A ,B)

产生的分组种数:3 种;

第一种:group by  C,A,B

第二种:group by  C,A

第三种:group by  C,NULL   等价于 group by  C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

4、 带rollup 且rollup子句括号内又使用括号对列进行组合

例1:Group by  rollup((A ,B))

产生的分组种数:2 种;

第一种:group by  A,B

第二种:group by  NULL

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例2:Group by  rollup(A ,(B,C))

产生的分组种数:3 种;

第一种:group by  A,B,C

第二种:group by  A

第三种:group by  NULL

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

注:对这种情况,可以理解为几个列被括号括在一起时,就只能被看成一个整体,分组时不需要再细化。因此也可推断rollup括号内也顶多加到一重括号,加多重了应该没有任何意义(这个推断我没有做验证的哦)。

 

二、与rollup组合使用的其它几个辅助函数

1、grouping()函数

必须接受一列且只能接受一列做为其参数。参数列值为空返回1,参数列值非空返回0。

2、grouping_id()函数

必须接受一列或多列做为其参数。

返回值为按参数排列顺序,依次对各个参数使用grouping()函数,并将结果值依次串成一串二进制数然后再转化为十进制所得到的值。

例如:grouping(A) = 0 ; grouping(B) = 1;

则:grouping_id(A,B)  =  (01)2  = 1;

                     grouping_id(B,A)  =  (10)2  =2;

3、group_id()函数

调用时不需要且不能传入任何参数。

返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。重复次数从0开始,例如某个分组第一次出现则返回值为0,第二次出现时返回值为1,……,第n次出现返回值为n-1。

        注:使用以上三个函数往往是为了过滤掉一部分统计数据,而达到美化统计结果的作用。

 

三、group by 后带rollup子句与 group by 后带cube子句区别

group by 后带rollup子句与 group by 后带cube子句的唯一区别就是:

带cube子句的group by 会产生更多的分组统计数据。cube后的列有多少种组合(注意组合是与顺序无关的)就会有多少种分组。

例:Group by  cube(A ,B,C)

产生的分组种数:8 种;

第一种:group by  A,B,C

第二种:group by  A,B

第三种:group by  A,C

第四种:group by  B,C

第五种:group by  C

第六种:group by  B

第七种:group by  A

第八种:group by  NULL

返回结果集:为以上八种分组统计结果集的并集且未去掉重复数据。

四、group by 后带grouping sets子句

    group by 后带grouping sets子句效果就是只返回小记记录,即只返回按单个列分组后的统计数据,不返回多个列组合分组的统计数据。

例1:Group by  grouping sets(A )

产生的分组种数:1 种;

第一种:group by  A

返回结果集:即为以上一种分组的统计结果集。

例2:Group by  grouping sets(A ,B)

产生的分组种数:2 种;

第一种:group by  A

第二种:group by  B

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例3:Group by  grouping sets (A ,B,C)

产生的分组种数:3 种;

第一种:group by  A

第二种:group by  B

第三种:group by  C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

转载连接:https://www.cnblogs.com/lxh1076/p/5697929.html

[转]group by 后使用 rollup 子句总结的更多相关文章

  1. Group by后加rollup、cube、Grouping_Sets的用法区别

    一.相关分析 通常当聚合率和数据量没有大于一定程度时,对于不涉及Rollup.Cube.Grouping_Sets这三种操作的聚合很少出现GC问题.对于Rollup.Cube.Grouping_Set ...

  2. 利用mysql中的SQL_CALC_FOUND_ROWS 来实现group by后的记录数统计

    最近正在做一个显示消息的列表页,列表页中需要根据一个字段来分组显示.并且需要一个分页的效果. 大家也知道group by 后的数据是每一组一行记录,统计分组后的总的记录数又不能用count,所以SQL ...

  3. 在oracle中,group by后将字符拼接,以及自定义排序

    1.在oracle中,group by后将字符拼接.任务:在学生表中,有studentid和subject两个字段.要求对studentid进行group by分组,并将所选科目拼接在一起.oracl ...

  4. 【SQL】SqlServer中Group By后,字符串合并

    参考: 1.SQL查询语句 group by后, 字符串合并 2.sql for xml path用法 #需求: 合并列值 表结构,数据如下: id value ----- ------ aa bb ...

  5. 7.7 使用rollup子句

    --向rollup传递一列select division_id,sum(salary) from employees2 group by rollup(division_id); --向rollup传 ...

  6. SQL GROUP BY 后排序

    由于GROUP BY 使用Sum函数后 ID等唯一值就无法查询出来了,所以想按照ID排序也就不可以了. 这时可以使用一个MIN 或者MAX函数来取得一个最小或者最大的ID 这样就可以实现以其中一条ID ...

  7. SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)

    --SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP  WITH CUBE  GROUPING SET(..) /*********************** ...

  8. SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)

    实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...

  9. MySql中对Group by后的结果数进行Count

    今天在写MySQ的SQL语句的时候遇到了一个奇怪的问题 select count(*) from subsitealbum t1, photo t2,files t3 where t1.SourceA ...

随机推荐

  1. sql server中replace()函数用法解析

    知识点一:replace()的语法 REPLACE ( string_replace1 , string_replace2 , string_replace3 ) 参数解析: string_repla ...

  2. Linux学习--- 宏定义下#、##的使用

    #   字符串化 ## 连接符号 eg: #include <stdio.h> #define ABC(x) #x #define DAY(c) myday##c int main (){ ...

  3. you-get 安装和用法

    以windows为例 安装 从https://github.com/soimort/you-get/releases/latest下载*-full.7z,解压后在cmd中切换至目录下执行you-get ...

  4. socketserver实现FTP

    功能: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...

  5. Thinking in Java Chapter 14

    From Thinking in Java 4th Edition RTTI(Run-Time Type Information),运行时类型信息,使得你可以在程序运行时发现和使用类型信息.对RTTI ...

  6. 笔记:Activity的启动过程

    Activity的创建特点 作为四大组件之一的Activity,它不像普通java对像那样,可以new出来,然后去使用.而是调用 startActivity()这样的方式启动.那么Android系统是 ...

  7. IDEA tomcat 热部署不生效的问题

  8. WebRTC 学习之 WebRTC 简介

    本文使用的WebRTC相关API都是基于Intel® Collaboration Suite for WebRTC的. 相关文档链接:https://software.intel.com/sites/ ...

  9. MySQL:锁

    根据加锁的范围,MySQL的锁可以分为全局锁,表级锁和行锁. 1. 全局锁 一般用于全局逻辑备份操作: 1.1 FTWRL MySQL提供了一个加全局读锁的方法.命令是:Flush tables wi ...

  10. WebMvcConfigurer

    [传送门]:详解WebMvcConfigurer接口 1. 设置跨域规则 @Configuration public class CrossOriginConfig implements WebMvc ...