GROUPING SETS、ROLLUP、CUBE
大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那么本文不适合你。还记得当初学习SQL的时候,总是理解不了GROUP BY的作用,经过好长时间才终于明白GROUP BY的真谛。当然,这和我本人笨也有关系,但是GROUP BY的确不好理解。本文将介绍DB2 GROUPING SETS、ROLLUP、CUBE的使用方法,这些关键字比GROUP BY更难理解,所以阅读本文的时候,一定要慢,仔细的分析,你理解的越多,需要记忆的就越少。
我们首先来看GROUPING SETS的使用方法,请看下面的例子
- GROUP BY GROUPING SETS (A,B,C) 等价与 GROUP BY A
- UNION ALL
- GROUP BY B
- UNION ALL
- GROUP BY C
从字面上理解,GROUPING SETS就是GROUP集合的意思,确实是这样的,从上面的例子,我们可以很容易的理解GROUPING SETS的使用方法,但是使用括号的时候需要我们特别注意,请看下面的例子
- GROUP BY GROUPING SETS ((A,B,C)) 等价与 GROUP BY A,B,C
- GROUP BY GROUPING SETS (A,(B,C)) 等价与 GROUP BY A
- UNION ALL
- GROUP BY B,C
我们应该把括号里面的所有内容看做一个整体,这个整体必须在同一个GROUP BY语句中,例如,语句2中的B,C在括号中,B,C必须在同一个GROUP BY语句中,千万别把他们拆开,写出GROUP BY B UNION ALL GROUP BY C,那样就大错特错了。
我们还可以在一个GROUP BY语句中多次使用GROUPING SETS,如下:
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B,C
- ,GROUPING SETS (B)
- ,GROUPING SETS (C)
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B,C
- ,GROUPING SETS ((B,C))
- GROUP BY GROUPING SETS (A) 等价于 GROUP BY A,B
- ,GROUPING SETS (B,C) UNION ALL
- GROUP BY A,C
我们还可以混合使用,如下:
- GROUP BY A 等价于 GROUP BY A
- ,B ,B
- ,GROUPING SETS ((B,C)) ,C
- GROUP BY A 等价于 GROUP BY A,B,C
- ,B UNION ALL
- ,GROUPING SETS (B,C) GROUP BY A,B
- GROUP BY A 等价于 GROUP BY A,B,C
- ,B UNION ALL
- ,C GROUP BY A,B,C
- ,GROUPING SETS (B,C)
请特别注意上面的第3条语句。
下面我们介绍一下ROLLUP和CUBE关键字,它们的使用方式类似,作用也类似,都是用来为GROUP BY语句返回的结果添加汇总信息,也可以说,它们是对分组结果进行二次分组。下面我们看一个简单的例子,如下:
- SELECT
- DEPT AS 部门,
- SEX AS 性别,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY ROLLUP(DEPT,SEX)
- ORDER BY 部门,性别
- 查询结果:
- 部门 性别 平均工资
- 市场部 女 3000
- 市场部 男 4500
- 市场部 NULL 4000
- 技术部 女 4500
- 技术部 男 2000
- 技术部 NULL 3666
- NULL NULL 3833
值得注意的是,上面的ROLLUP语句中,部门(DEPT)和性别(SEX)的顺序非常重要,如果我们互换一下它两的顺序,将得到不同的结果,如下:
- SELECT
- SEX AS 性别,
- DEPT AS 部门,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY ROLLUP(SEX,DEPT)
- ORDER BY 性别,部门
- 查询结果:
- 性别 部门 平均工资
- 女 市场部 3000
- 女 技术部 4500
- 女 NULL 4000
- 男 市场部 4500
- 男 技术部 2000
- 男 NULL 3666
- NULL NULL 3833
CUBE语句比ROLLUP语句返回更多的内容,以下是将上面语句的ROLLUP替换为CUBE后得到的结果:
- SELECT
- DEPT AS 部门,
- SEX AS 性别,
- AVG(SALARY) AS 平均工资
- FROM
- (
- --姓名 性别 部门 工资
- VALUES
- ('张三','男','市场部',4000),
- ('赵红','男','技术部',2000),
- ('李四','男','市场部',5000),
- ('李白','女','技术部',5000),
- ('王五','女','市场部',3000),
- ('王蓝','女','技术部',4000)
- ) AS EMPLOY(NAME,SEX,DEPT,SALARY)
- GROUP BY CUBE(DEPT,SEX)
- ORDER BY 部门,性别
- 查询结果:
- 部门 性别 平均工资
- 市场部 女 3000
- 市场部 男 4500
- 市场部 NULL 4000
- 技术部 女 4500
- 技术部 男 2000
- 技术部 NULL 3666
- NULL 女 4000
- NULL 男 3666
- NULL NULL 3833
如果我们替换CUBE语句中部门(DEPT)和性别(SEX)的顺序,我们将会得到相同的结果。
----更多参见:DB2 SQL 精萃
----声明:转载请注明出处。
----last updated on 2010.1.15
----written by ShangBo on 2010.1.15
----end
GROUPING SETS、ROLLUP、CUBE的更多相关文章
- 转:GROUPING SETS、ROLLUP、CUBE
转:http://blog.csdn.net/shangboerds/article/details/5193211 大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那 ...
- SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...
- (2.4)DDL增强功能-数据汇总grouping、rollup、cube
参考:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 1.rollup (1)rollup在group by 子句中使用 ...
- Group By 多个分组集小结 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()
T-SQL 多个分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版 示例数据库下载: http:// ...
- vue、rollup、sass、requirejs组成的vueManager
近段时间本人一直在思考如何基于vue搭建一个中后端管理系统的通用基础前端解决方案.思考的主要问题点如下: 如何使各个子业务模块的按需加载 css预处理方案的选择 如何引入现代的前端工程思想,也就是工程 ...
- SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别
转自:http://www.cnblogs.com/dyufei/archive/2009/11/12/2573974.html 不言自明,看SQL就完全理解了,不需要过多解释,不错,分享之: ROL ...
- SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数
SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 先来创建一个测试表 USE [tempdb] GO )) GO INSERT INTO [#te ...
- Grouping Sets:CUBE和ROLLUP从句
在上一篇文章里我讨论了SQL Server里Grouping Sets的功能.从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组.但如果像从所给的列集里想要有所有可能的分布——即所谓的 ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
随机推荐
- Git安装及基本使用
准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...
- Jquery dom搜索之siblings()方法
如果给定一个dom的元素集合的算则其对象,siblings()方法允许我们在dom树中搜索这个元素集合的同胞元素,并匹配这些元素构造一个新的对象,Jquery文档里面是这么说的,那么让我来用简单易懂的 ...
- 简单的web三层架构系统【第五版】
接上一版,今天差不多就是三层架构后台代码的完结了,这一版写完,接下来就是前台的制作了,前台不太熟悉,还在深入学习.过一段时间在写,今天先把后台代码写完. 三层架构包括DAL层, BLL层, UI层(也 ...
- URAL 1036(dp+高精度)
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- 关于MATLAB中any和all的个人理解
any: any=1,有一个元素是1,即可: any=0,全部元素为0,即可. all: all=1,全部元素是1,即可: all=0,有一个元素是0,即可. ALL True if all elem ...
- ##DAY5 UIControl及其子类
##DAY5 UIControl及其子类 #pragma mark ———————UIControl——————————— UIControl初识: 1)UIControl是有控制功能的视图(比如UI ...
- ACM比赛
Description A soldier wants to buy w bananas in the shop. He has to pay k dollars for the first bana ...
- Android应用开发提高篇(1)-----获取本地IP
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...
- WinSock网络编程基础(2)客户端
接下来说一下如何用WinSock创建基于TCP/IP模型的客户端和服务器. TCP可以提供两个计算机间可靠无误的数据传输,应用程序使用TCP通信时,会在两台计算机之间建立一个虚拟连接,连接之后计算机之 ...
- JS学习之事件冒泡
(1)什么是事件起泡 首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生. 当事件发生后,这个事件就要开始传播.为什 ...