最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个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仅仅是一个可以少写代码的语法糖,但实际情况是,group sets在遇到多个条件时,聚合是一次性从数据库中取出所有需要的操作的数据,在内存中对数据库进行聚合操作并生成结果。而union all是多次扫描表,将返回的结果进行union操作。这也就是为什么grouping sets和union操作所返回的数据顺序是不同的原因。
下面通过查看上面两个语句的IO和CPU来进行对比:
通过上面的图来看grouping sets不仅仅只是语法糖,而是从执行原理做出了改变
对于grouping sets来说,还经常和grouping函数联合使用,这个函数是反应目标列是否聚合,如何聚合则返回1,否则返回0,如下:
转自:http://www.cnblogs.com/CareySon/archive/2011/12/19/2293245.html