• TSQL查询——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仅仅是一个可以少写代码的语法糖,但实际情况是,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

  • 相关阅读:
    30个实例详解TOP命令
    CentOS6 启动流程图文解剖
    Linux常用性能检测命令解释
    Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 转
    linux系统中如何查看日志 (常用命令2)
    Linux下常用的shell命令记录1
    python import as from
    内存的大小端模式
    opencv笔记1
    代码不仅仅考虑性能
  • 原文地址:https://www.cnblogs.com/zhijianliutang/p/2335694.html
Copyright © 2020-2023  润新知