(4.6)sql2008中的group by grouping sets
最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看.
直到发现在SQL SERVER 2008之后引入了GROUPING SETS这个对于GROUP BY的增强后,上面的需求实现起来就简单多了,下面我用AdventureWork中的表作为DEMO来解释一下GROUPING SETS.
假设我现在需要两个维度查询我的销售订单,查询T-SQL如下:

而使用SQL SERVER 2008之后新增的GROUPING SETS语句,仅仅需要这样写:

值得注意的是,虽然上面使用GROUPING SETS语句和多个GROUP BY语句产生的结果是完全一样的,但顺序却完全不同。
GROUPING SETS,仅仅是语法糖?
从上面结果来看,使用GROUPING SETS仅仅是一个可以少写些代码的语法糖.但实际情况是,GROUPING SETS在遇到多个条件时,聚合是一次性从数据库中取出所有需要操作的数据,在内存中对数据库进行聚合操作并生成结果。而UNION ALL是多次扫描表,将返回的结果进行UNION操作,这也就是为什么GROUPING SETS和UNION操作所返回的数据顺序是不同的.
下面通过查看上面两个语句的IO和CPU来进行对比:

通过上面的图来看GROUPING SETS不仅仅只是语法糖.而是从执行原理上做出了改变.
对于GROUPING SETS来说,还经常和GROUPING函数联合使用,这个函数是反映目标列是否聚合,如何聚合则返回1,否则返回0,如下:

(4.6)sql2008中的group by grouping sets的更多相关文章
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- Group By Grouping Sets
Group by分组函数的自定义,与group by配合使用可更加灵活的对结果集进行分组,Grouping sets会对各个层级进行汇总,然后将各个层级的汇总值union all在一起,但却比单纯的g ...
- Oracle PL/SQL之GROUP BY GROUPING SETS
[转自] http://blog.csdn.net/t0nsha/article/details/6538838 使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNIO ...
- GROUP BY GROUPING SETS 示例
--建表 create table TEst1 ( ID ), co_CODE ), T_NAME ), Money INTEGER, P_code ) ); --插入基础数据 insert into ...
- 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 ...
- GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
oracle group by中rollup和cube的区别: Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句.CUBE ROLLUP 是用于统计数据的. 实验 ...
- Oracle中group by 的扩展函数rollup、cube、grouping sets
Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...
- SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...
随机推荐
- 中小企业项目的痛VS感人IT团队
早上,接到客户电话,dynamics CRM不能用了,此客户从开始安装程序开始二次开发期间,因电源问题导致服务器多次意外断电,至今也不加UPS电源.前几次,都不是很严重,服务器没有大量文件损坏,操作系 ...
- 今天升级netbean出错
出现:无法初始化 UI netbean 由于ubuntun装的是open jdk 直接删除open jdk就可以 sudo apt-get autoremove open-jdk*
- python read文件内容的iter方式
遍历file的方式 iter(lambda: f.read(4096), "")等价与while True: data = f.read(4096) if not data: br ...
- CI cookie 存放数组
#ci cookie 由于不能存放数组,所有必须序列化之后在存入数组中 #定义数组 $cookie_array=array( 'shop_id'=>$gid, 'shop_name'=> ...
- Python_uuid 学习总结
1. 背景知识: UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, ...
- Flash AS 2.0右键菜单问题
这几天都在忙这个右键菜单,因为之前的右键菜单都不能用了,必须做新的. 可是又必须使用原来2.0的接口和方法,真是忙的焦头烂额. 之前2.0的东西太多又太杂. 我头一个右键菜单和二级菜单没有问题了,做第 ...
- cobbler 修改 distro_signatures.json
edit file in /var/lib/cobbler/distro_signatures.json and restart cobblerd service 转自: https://lists. ...
- (转)ThreadLocal
转自:http://blog.csdn.net/lufeng20/article/details/24314381 Thread同步机制的比较 ThreadLocal和线程同步机制相比有什么优势呢?T ...
- 为什么要使用docker
1. 为什么要使用Docker Docker容器虚拟化的好处 Docker项目的发起人和Docker Inc.的CTO Solomon Hykes认为,Docker在正确的地点.正确的时间顺应了正确的 ...
- Windows按名称排序问题
偶然发现一个按名称排序的文件夹内,文件顺序是混乱的,例如: 在一个文件夹内建立如下三个文件: 0F.txt 1A.txt 02.txt 按名称/升序排列, 将得到上述结果,0F在最前,02在最后. 百 ...