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 ...
随机推荐
- 通过反射获取Android通知栏高度
public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; F ...
- 安装配置NFS服务
超级好的配置centos下服务的链接 http://www.server-world.info/en/note?os=CentOS_6&p=nfs http://linux.vbird.org ...
- HttpURLConnection GET/POST写法
现在虽然HttpClient很好使,但也有人在用最原生的HttpURLConnection, 记录一下,备忘之. public class HttpUrlConnect { //get请求 publi ...
- Linux所有者和组
组 添加组 groupadd 组名 查看所有组 cat /etc/group 添加成员useradd -g 组名 用户名 查看成员 cat /etc/passwd 查看用户权限 ls -l d rw ...
- 清除mac os svn密码命令行缓存
删除认证缓存设置即可,如下:rm -rf ~/.subversion/auth by yytong
- 1.C#中几个简单的内置Attribute
阅读目录 一:Obsolete 二:Conditional 一:Obsolete 这个内置属性是说这个方法废弃了不可用,它有两个参数,第一个参数message是说废弃的原因,第二个参数err ...
- 将树苺派升级到Raspbian 8 (Jessie)
我的树苺派2B跑的是Raspbian 7 (Wheezy),有不少软件都让我觉察出老旧来.想着Debian官方已经发布Debian 8 (Jessie)大半年了(8.0发布于2015/04/25),树 ...
- Reset Entity-Framework Migrations
You need to delete the state: Delete the migrations folder in your project Delete the __MigrationHis ...
- .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常
转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...
- C语言函数可变长度参数剖析
C语言中的很多函数的入参被定义为可变参数,最典型的 int printf (const char * fmt, ...) 要对其中的可变参数进行处理,就要用到va_list类型和 VA_START, ...