转:GROUPING SETS、ROLLUP、CUBE
转:http://blog.csdn.net/shangboerds/article/details/5193211
大家对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)的顺序,我们将会得到相同的结果
转:GROUPING SETS、ROLLUP、CUBE的更多相关文章
- SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)
实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...
- GROUPING SETS、CUBE、ROLLUP
其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; G ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
- Hive高级聚合GROUPING SETS,ROLLUP以及CUBE
scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...
- Hive高阶聚合函数 GROUPING SETS、Cube、Rollup
-- GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起 ...
- SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)
--SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP WITH CUBE GROUPING SET(..) /*********************** ...
- Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP
概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
- Hive SQL grouping sets 用法
概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...
随机推荐
- 我的android学习经历38
anddroid studio的内存修改 昨天有位朋友问到了下面的一个问题 这个判断为android studio的分配的内存不够用. 据我的了解造成这个的原因主要有以下几个方面: 1.电脑的内存本来 ...
- 调度系统任务创建---创建一个MultiJob的任务(四)
我们如果下面这种拓扑结构的调度任务,该任务的拓扑结构就是一个有向五环图DAG,有fork,有join的操作等. 可以通过jenkins创建MultiJob的任务实现: 实例任务的拓扑结构: Multi ...
- 《BI那点儿事》数据流转换——多播、Union All、合并、合并联接
建立测试数据: CREATE TABLE FactResults ( Name ) , Course ) , Score INT ) INSERT INTO FactResults ( Name , ...
- onethink使用经验
1 建议随时从oschina上下载onethink的最新版本,如果你遇到了怎么都解决不了的问题,比如菜单管理自定义菜单,左侧二级菜单不显示的问题,好像有一个历史版本就是有bug,好像是1.1开始的一个 ...
- Android Tips – 填坑手册
出于: androidChina http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...
- Workspace defines a VM that does not contain a valid jre/lib/rt.jar: C:\Program Files\Java\jre7
Maven编译时两则信息 (Workspace以及default classpath container) 博客分类: Java 使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想查明 ...
- ubuntu 安装eclipse,adt,android sdk,离线
1.安装jdk 环境变量 $ sudo gedit ~/.bashrc export JAVA_HOME=/usr/local/jdk1.8.0_65export JRE_HOME=${JAVA_HO ...
- DbInitializer.cs初始化过程中context.entityName.Add()遇到的类型不匹配错误
用Asp.Net Core+EF Core建立一个测试项目过程中,使用DbInitializaer.cs进行数据库表的初始化工作,当项目测试运行时执行到context.实体名.Add()时,提示错误信 ...
- DEV:GridControl 筛选复选框 Checked Dropdown更改数据源
用了DEV网站给的图: 起初,我并不知道这个圈起来的部分叫做Filter Dropdown,这个List里面的数据默认与GridControl中的数据保持一致的. 现在需要对这个FilterDropd ...
- HR函数学习02——分配组织单位
REPORT ZLYHR01. "创建组织单元 成功 DATA:LS_OBJ TYPE OBJEC, LV_STU TYPE GDSTR-SVECT, LV_TIT TYPE CHAR20, ...