Grouping Sets:CUBE和ROLLUP从句
在上一篇文章里我讨论了SQL Server里Grouping Sets的功能。从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组。但如果像从所给的列集里想要有所有可能的分布——即所谓的幂集(Power Set),要怎么做呢?
当然,你可以用grouping set的语法功能来手动生成幂集,但那需要写一大堆的代码。因此今天我向你展示下grouping set功能支持的2个从句:CUBE和ROLLUP从句。
CUBE从句
使用CUBE从句,对于提供的列集,你可以生成所有可能的分组集。这就是所谓的幂集。当你有3列:a,b,和c。CUBE(a,b,c)会为你生成下列分组:
- (a,b,c)
- (a,b)
- (b,c)
- (a)
- (b)
- (c)
- ()
下列查询对CustomerID, SalesPersonID和YEAR(OrderDate) 列通过上周介绍的grouping set功能手工生成幂集。
-- Calculates the power set of CustomerID, SalesPersonID, YEAR(OrderDate)
SELECT
CustomerID,
SalesPersonID,
YEAR(OrderDate) AS 'OrderYear',
SUM(TotalDue) AS 'TotalDue'
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
GROUP BY GROUPING SETS
(
(CustomerID, SalesPersonID, YEAR(OrderDate)),
(CustomerID, SalesPersonID),
(CustomerID, YEAR(OrderDate)),
(SalesPersonID, YEAR(OrderDate)),
(CustomerID),
(SalesPersonID),
(YEAR(OrderDate)),
()
)
GO
从代码里可以看到,你必须指定每个可能的组合。因此用简单的需求写出这样的查询是个很困难的,笨重的工作。如果你使用CUBE从句而不是指定各个分组集的话,事情就变得简单多了。我们来看下面的代码。
-- Calculates the power set of CustomerID, SalesPersonID, YEAR(OrderDate) with the CUBE subclause
SELECT
CustomerID,
SalesPersonID,
YEAR(OrderDate) AS 'OrderYear',
SUM(TotalDue) AS 'TotalDue'
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
GROUP BY CUBE(CustomerID, SalesPersonID, YEAR(OrderDate))
GO
从代码里可以看到,你只要指定列,SQL Server本身就会生成它的幂集。于第一次列出的代码,这个代码简单,精炼很多。
ROLLUP从句
除CUBE从句外,自SQL Server 2008起,SQL Server也支持ROLLUP从句。使用ROLLUP从句你可以定义幂集的子集。ROLLUP从句也假设各个列间的层级。当你有3列:a,b,和c。当你使用ROLLUP(a,b,c),它会生成下列分组集:
- (a,b,c)
- (a,b)
- (a)
- ()
从这些独立的分组集,你很容易看到在这些列之间有个层级。我们换用CustomerID, SalesPersonID和YEAR(OrderDate) 列,这里你就可以获得这类分析查询的实现思路。这是SSAS(SQL Server分析服务)的穷人做法。我们来看下列使用ROLLUP从句的查询:
-- Calculates the following grouping sets:
-- => (OrderYear, OrderMonth, OrderDay)
-- => (OrderYear, OrderMonth)
-- => (OrderYear)
-- => ()
SELECT
YEAR(OrderDate) AS 'OrderYear',
MONTH(OrderDate) AS 'OrderMonth',
DAY(OrderDate) AS 'OrderDay',
SUM(TotalDue) AS 'TotalDue'
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
GROUP BY ROLLUP(YEAR(OrderDate), MONTH(OrderDate), DAY(OrderDate))
GO
这个查询的输出给你下列各自分组集:
- (OrderYear, OrderMonth, OrderDay)
- (OrderYear, OrderMonth)
- (OrderYear)
- ()
ROLLUP从句有非常简单的语法,但对于数据分析来说你的返回结果是非常强大的。
小结
我希望你对今天文章里,自SQL Server 2008引入的grouping sets功能里的CUBE和ROLLUP子句的介绍有所收获。有空的话,不要吝啬你的留言,告诉我你是否已经在你自己的数据库里使用这些从句,或者你是否认为在你的环境里它们是有用的。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2014/09/22/grouping-sets-the-cube-and-rollup-subclauses/
Grouping Sets:CUBE和ROLLUP从句的更多相关文章
- SQL Server ->> GROUPING SETS, CUBE, ROLLUP, GROUPING, GROUPING_ID
在我们制作报表的时候常常需要分组聚合.多组聚合和总合.如果通过另外的T-SQL语句来聚合难免性能太差.如果通过报表工具的聚合功能虽说比使用额外的T-SQL语句性能上要好很多,不过不够干脆,还是需要先生 ...
- grouping sets,cube,rollup,grouping__id,group by
例1: hive -e" select type ,status ,count(1) from usr_info where pt='2015-09-14' group by type,st ...
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- Group By 多个分组集小结 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()
T-SQL 多个分组集共有三种 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以当做是GROUPING SETS的简写版 示例数据库下载: http:// ...
- Oracle的rollup、cube、grouping sets函数
转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...
- 解析数仓OLAP函数:ROLLUP、CUBE、GROUPING SETS
摘要:GaussDB(DWS) ROLLUP,CUBE,GROUPING SETS等OLAP函数的原理解析. 本文分享自华为云社区<GaussDB(DWS) OLAP函数浅析>,作者: D ...
- TSQL 分组集(Grouping Sets)
分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...
- 转: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 ...
随机推荐
- linux云主机怎么安装WDCP
linux云主机 教你成功安装WDCP的2个方法(第一个不成功就试第2个) 工具/原料 Xshell 云服务器 方法/步骤 1 先用Xshell连接你的服务器 2 输入一下代码 wget ...
- Awesome C/C++
Awesome C/C++ A curated list of awesome C/C++ frameworks, libraries, resources, and shiny things. In ...
- int android.graphics.Bitmap.getRowBytes()
int android.graphics.Bitmap.getRowBytes() Return the number of bytes between rows in the bitmap's pi ...
- Java线程与Linux内核线程的映射关系[转]
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- java/.net-常用工具下载地址&常用学习网址&快捷键
HTML5 HTML5:http://www.html5cn.org/ php常用网址 thinkphp框架:http://www.thinkphp.cn/ wampserver开发服务器:http: ...
- dede教程之后台登录是自动跳出解决方法
有时也不知道什么原因,登录后台时输入全部正确点确认按钮时却会自动跳出.必须输入http://你的域名/dede/login.php才可以登录.通过尝试最终解决了问题,下面分享出来: 1.打开根目录da ...
- Tomcat抛出异常:ClientAbortException: java.net.SocketException: Connection
在做一个小网站的时候,写了一个通过servlet实现文件下载功能的页面.当我点击超级练级,弹出下载对话框,点击保存正常下载,不会出现任何问题,当我我点击取消,服务器端就出现如下提示: ClientAb ...
- c#如何区分静态只读变量和常量
常量const 常量就是一个其值永远不会改变的静态字段.常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值.常量可以是C#内建的任何数字类型或枚举类型.声明一个常量的时候必须对 ...
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- saiku执行速度慢
使用saiku的过程中发现一个重要问题,速度慢!下面是跟踪和优化过程 一.首先抓包,发现ajax请求:http://l-tdata2.tkt.cn6.qunar.com:8080/saiku/rest ...