在上一篇文章里我讨论了SQL Server里Grouping Sets的功能。从文中的例子能够看到,经过简单定义须要的分组集是很容易进行各自分组。但若是像从所给的列集里想要有全部可能的分布——即所谓的幂集(Power Set),要怎么作呢?
html
固然,你能够用grouping set的语法功能来手动生成幂集,但那须要写一大堆的代码。所以今天我向你展现下grouping set功能支持的2个从句:CUBE和ROLLUP从句。sql
使用CUBE从句,对于提供的列集,你能够生成全部可能的分组集。这就是所谓的幂集。当你有3列:a,b,和c。CUBE(a,b,c)会为你生成下列分组:数据库
下列查询对CustomerID, SalesPersonID和YEAR(OrderDate) 列经过上周介绍的grouping set功能手工生成幂集。 spa
1 -- Calculates the power set of CustomerID, SalesPersonID, YEAR(OrderDate) 2 SELECT 3 CustomerID, 4 SalesPersonID, 5 YEAR(OrderDate) AS 'OrderYear', 6 SUM(TotalDue) AS 'TotalDue' 7 FROM Sales.SalesOrderHeader 8 WHERE SalesPersonID IS NOT NULL 9 GROUP BY GROUPING SETS 10 ( 11 (CustomerID, SalesPersonID, YEAR(OrderDate)), 12 (CustomerID, SalesPersonID), 13 (CustomerID, YEAR(OrderDate)), 14 (SalesPersonID, YEAR(OrderDate)), 15 (CustomerID), 16 (SalesPersonID), 17 (YEAR(OrderDate)), 18 () 19 ) 20 GO
从代码里能够看到,你必须指定每一个可能的组合。所以用简单的需求写出这样的查询是个很困难的,笨重的工做。若是你使用CUBE从句而不是指定各个分组集的话,事情就变得简单多了。咱们来看下面的代码。code
1 -- Calculates the power set of CustomerID, SalesPersonID, YEAR(OrderDate) with the CUBE subclause 2 SELECT 3 CustomerID, 4 SalesPersonID, 5 YEAR(OrderDate) AS 'OrderYear', 6 SUM(TotalDue) AS 'TotalDue' 7 FROM Sales.SalesOrderHeader 8 WHERE SalesPersonID IS NOT NULL 9 GROUP BY CUBE(CustomerID, SalesPersonID, YEAR(OrderDate)) 10 GO
从代码里能够看到,你只要指定列,SQL Server自己就会生成它的幂集。于第一次列出的代码,这个代码简单,精炼不少。 htm
除CUBE从句外,自SQL Server 2008起,SQL Server也支持ROLLUP从句。使用ROLLUP从句你能够定义幂集的子集。ROLLUP从句也假设各个列间的层级。当你有3列:a,b,和c。当你使用ROLLUP(a,b,c),它会生成下列分组集:blog
从这些独立的分组集,你很容易看到在这些列之间有个层级。咱们换用CustomerID, SalesPersonID和YEAR(OrderDate) 列,这里你就能够得到这类分析查询的实现思路。这是SSAS(SQL Server分析服务)的穷人作法。咱们来看下列使用ROLLUP从句的查询: get
-- 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
这个查询的输出给你下列各自分组集: 数据分析
ROLLUP从句有很是简单的语法,但对于数据分析来讲你的返回结果是很是强大的。 it
我但愿你对今天文章里,自SQL Server 2008引入的grouping sets功能里的CUBE和ROLLUP子句的介绍有所收获。有空的话,不要吝啬你的留言,告诉我你是否已经在你本身的数据库里使用这些从句,或者你是否定为在你的环境里它们是有用的。
感谢关注!
https://www.sqlpassion.at/archive/2014/09/22/grouping-sets-the-cube-and-rollup-subclauses/