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. VS“新建网站”与“新建Asp.Net Web 应用程序”的区别

    WebApplication(新建Asp.Net Web 应用程序)编程模型的优点:针对大型网站 1.编译速度网站编译速度快,使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去. 2. ...

  2. Maths | 为什么点积等价于投影后的乘积

    目录 1. 复习点积 2. 点积的对称性 3. 矩阵与变换的关系 4. 一维矩阵也是一种线性变换 5. 最终解释:为什么是投影 先上结论: \(\boldsymbol v\)和\(\boldsymbo ...

  3. linux上安装zookeeper

    本文先讲述Linux下单机版的安装流程,集群的配置后续再补上.关于Zookeeper的基本介绍和原来在本文不做更多介绍,可以自行查找.本文的操作流程相对简单,仅做备忘而已. 第一步  安装JDK:   ...

  4. Delphi - TDateTimePicker使用注意问题

    TDateTimePicker使用时候,如果想获取到修改后的值,必须注Kind和time属性必须对应! 1,时间设置: treatmentTime1DTPicker.Kind := dtkTime; ...

  5. NLP常用术语解析

    分词(Segment):中英文都存在分词的问题,不过相对来说,英文单词与单词之间本来就有空格进行分割,所以处理起来相对方便.但是中文书写是没有分隔符的,所以分词的问题就比较突出.分词常用的手段可以是基 ...

  6. Android 富文本编辑器实现方案

    本人实现富文本编辑器的时候,总结了如下两种方案: 1. 纯 EditText 实现方案 2. 使用ScrollView作为最外层的父容器来控制展示效果 示例demo地址为:https://github ...

  7. react小知识2

    概述 这是我学习react的过程中,学到的一些简便写法,都是利用了es6的特性,记录下来供以后开发时参考,相信对其他人也有用. 参考资料:dva.js 知识导图 析构 我们也可以析构传入的函数参数. ...

  8. typescript handbook 学习笔记1

    概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...

  9. Zabbix-3-自定义脚本获取数据

    通过在agent中加入脚本,来获取数据,生成图形

  10. jsp页面跳转页面的几中方式(同步更新)

    1. 通过<a>标签跳转网页a) 通过<a>标签直接跳转b) 通过<a>标签调用JavaScript函数,然后再进行跳转 2. 通过表单形式跳转网页a) 通过表单跳 ...