转: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数. ...
随机推荐
- 如何阅读《ECMAScript 2015 Language Specification》
你不需要把<ECMAScript 2015 Language Specification>通读一遍,因为没那个必要. 阮一峰建议: 对于一般用户来说,除了第4章,其他章节都涉及某一方面 ...
- nginx简单的rewrite配置
假设当前已存在location /test/,希望配置一个短连接/ts/与之相同,就需要用到rewrite 直接配置到server段 rewrite ^/ts/(.*) /test/$1; 或者放到l ...
- linux内核3.4基于wakeup_source的autosleep机制分析
点击打开链接 一:wakeup_source简介: linux 3.4内核PM使用了wakeup_source来保持唤醒状态,也就是keep awake.之前android一直是基于Linux加入了w ...
- redhat6.3安装MySQL-server-5.6.13-1.el6.x86_64.rpm
redhat6.3安装MySQL-server-5.6.13-1.el6.x86_64.rpm 首先下载下面三个文件: [plain] MySQL-client-5.6.13-1.el6.x ...
- How To Use DBLink In Oracle Forms 6i
You want to connect multiple databases in oracle forms to perform certain tasks, for example you nee ...
- Openstack+Kubernetes+Docker微服务实践之路--基础设施
近两年微服务在网上聊的如此的如火如荼,备受关注,我在去年下半年的一个项目中也用到了阿里云的EDAS.HSF,深有体会,最近时间空闲出于好奇,决定一探究竟打算自建微服务平台,基本实现EDAS.HSF的功 ...
- 关于autoptr
参考自: http://www.cppblog.com/expter/archive/2009/03/29/78270.html auto_ptr是什么. 解释1.auto_ptr是一个管理指针的对象 ...
- python ConfigParser配置读写
一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号"[ ]"内包含的为section.section 下面为类似于key ...
- DuiLib 自定义识别控件
遇到一个断点无法识别自定义的控件,运气比较好,一搜就搜出来了: 参考地址:http://www.bkjia.com/ASPjc/992050.html 主要是这个函数: CControlUI* CDi ...
- psd切图
打开UI设计师给你的PSD文件,我们以下图为例,截产品超市前面的购物车 1.按v选择移动工具,然后在上面的选项栏中勾选自动选择,在再右边选择图层 2.这时候用鼠标选中产品超市前面的购物车,就能在右边的 ...