Grouping Sets:CUBE和ROLLUP从句

摘要:
在上一篇文章里我讨论了SQLServer里GroupingSets的功能。因此今天我向你展示下groupingset功能支持的2个从句:CUBE和ROLLUP从句。使用ROLLUP从句你可以定义幂集的子集。ROLLUP从句也假设各个列间的层级。我们来看下列使用ROLLUP从句的查询:--Calculatesthefollowinggroupingsets:--=˃--=˃--=˃--=˃()SELECTYEARAS'OrderYear',MONTHAS'OrderMonth',DAYAS'OrderDay',SUMAS'TotalDue'FROMSales.SalesOrderHeaderWHERESalesPersonIDISNOTNULLGROUPBYROLLUPGO这个查询的输出给你下列各自分组集:()ROLLUP从句有非常简单的语法,但对于数据分析来说你的返回结果是非常强大的。小结我希望你对今天文章里,自SQLServer2008引入的groupingsets功能里的CUBE和ROLLUP子句的介绍有所收获。

在上一篇文章里我讨论了SQL Server里Grouping Sets的功能。从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组。但如果像从所给的列集里想要有所有可能的分布——即所谓的幂集(Power Set),要怎么做呢?

当然,你可以用grouping set的语法功能来手动生成幂集,但那需要写一大堆的代码。因此今天我向你展示下grouping set功能支持的2个从句:CUBEROLLUP从句。

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功能手工生成幂集。

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 FROMSales.SalesOrderHeader
8 WHERE SalesPersonID IS NOT NULL
9 GROUP BY GROUPINGSETS
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从句而不是指定各个分组集的话,事情就变得简单多了。我们来看下面的代码。

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 FROMSales.SalesOrderHeader
8 WHERE SalesPersonID IS NOT NULL
9 GROUP BY CUBE(CustomerID, SalesPersonID, YEAR(OrderDate))
10 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'
FROMSales.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从句》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇查看 Apache并发请求数及其TCP连接状态Gpupdate命令详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity资源Assetbundle

转  Unity资源打包之Assetbundle 本文原创版权归 csdn janeky 所有,转载请详细注明原创作者及出处,以示尊重! 作者:janeky 原文:http://blog.csdn.net/janeky/article/details/17652021 如果这篇文章对你有帮助,敬请关注作者《Unity手游之路》系列教程。 在手游的运营过程中...

某公司基于FineBI数据决策平台的试运行分析报告

一、数据平台的软硬件环境 二、组织机构和权限体系 组织机构:平台中已集成一套组织机构,可以建立部门、人员。也可以与现有系统的组织机构集成,将组织机构导入到平台中。 功能权限:通过配置功能点URL的方式实现各个用户相应的BI访问权限。用户第一次访问受保护的资源(某个功能点)时,会发出访问请求,服务器接收到请求后会验证用户权限,如果没有通过验证则返回登录页面...

Unity3D 使用XML进行简单的配置文件改动

1、首先是看看效果图: 開始执行项目例如以下图所看到的 2、点击绿色button改动配置文件再点击改动button成功改动方块颜色 3、接了下是实现的过程: 首先在Hierarchy创建一个cube。其次在Assets下分别创建Scenes和Scripts目录,各自是用来保存的的当前的场景和我们所写的脚本。在Scripts目录以下右键创建一个C#脚本...

Unity3D实践系列02,查看Scene窗口物体

删除"Hierarchy"窗口中的"Directional Light"。 把鼠标放在"Scene"窗口,滑动鼠标滚轮,可以对"Scene"窗口进行缩放。 把鼠标放在"Scene"窗口,按住alt键,按住鼠标左键,可以对"Scene"窗口进行角度调整。 点击"Hierarchy"窗口中的"Main Camera","Secne"窗口中的Camera处于选中...

当微信小程序遇到AR(三)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。 本课程需要一定的基础:微信开发者工具,JavaScript,Html,Css 第三章:基石-接入Three.js 【前情提要】 上一章,我们已经可以在微信小程序中访问摄像头,并且获得每一帧的数据了。接下...

BI笔记之SSAS库Process的几种方案

本文综合描述SSAS库的处理的几种方案,并简单介绍各种方案的应用场景。 环境约定:SQL Server 2008 示例库:Adventure Works DW 方式一:直接在项目中Process 这种方法在开发阶段和测试阶段是经常使用的。 如图这种处理方式通常是第一次的全量处理,如果SSAS库犹更新的话会提示先部署。 可以看到在出现的Proc...