最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个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,如下:

T-SQL中的GROUP BY GROUPING SETS相关推荐

  1. 解决数据倾斜一:RDD执行reduceByKey或则Spark SQL中使用group by语句导致的数据倾斜

    一:概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...

  2. oracle中having的用法,深入浅析SQL中的group by 和 having 用法

    一.sql中的group by 用法解析: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". 作用:通过一定的规则将一个数据集划分成 ...

  3. 【转】SQL中where, group by, having的用法和区别

    group by,where,having 是数据库查询中最常用的几个关键字.在工作中,时常用到,那么,当一个查询中使用了where ,group by ,having及聚集函数时 ,执行顺序是怎么样 ...

  4. 选择列表中的列'sc.cno'无效,因为该列没有包含在聚合函数或者group by 字句中《SQL中的group by该怎么用?》

    1.SQL Server中,子查询不能返回多个值 2.子查询中不能包含ORDER BY子句 3.group by 可以将查询结果按某一列或多列的值进行分组.group by 一般是和聚合函数一起搭配使 ...

  5. sql中不用group by分组进行计总

    废话不多说,直接上代码 create table test(keyid int identity,sort varchar(10),qty int ) insert into test(qty,sor ...

  6. oracle中的roll up,oracle  group by 与roll up,cube,grouping sets,grouping_id联合使用

    Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollup.cube.grouping sets. 1 rollup 假设有一个表test,有A.B.C.D.E5列. 如果使 ...

  7. 深入理解 SQL 中的 Grouping Sets 语句

    前言 SQL 中 Group By 语句大家都很熟悉,根据指定的规则对数据进行分组,常常和聚合函数一起使用. 比如,考虑有表 dealer,表中数据如下: id (Int) city (String) ...

  8. oracle group by 两项,Oracle中group by 的扩展函数rollup、cube、grouping sets

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...

  9. mysql group by cube_SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE

    1.创建表 Staff CREATE TABLE [dbo].[Staff]([ID] [int] IDENTITY(1,1) NOT NULL,[Name] [varchar](50) NULL,[ ...

最新文章

  1. Java基本数据类型转换|字符和字符串
  2. BUZZER Driver
  3. Ubuntu16.04中的可重定位目标文件
  4. zynq上NEON进行fft
  5. Ubuntu文件的复制、移动和删除命令
  6. logging通过配置文件设置同时输出到终端与文件
  7. 【深度学习】修改每张人像---ImageNet 的衰落
  8. 1000:入门测试题目
  9. zigbee物联网模块市场:LTE标准Cat.1和nbiot无线通信模块差异
  10. 代理模式用来初始化的延迟下载
  11. 机器学习基石13-Hazard of Overfitting
  12. 西瓜书《机器学习》线性模型 对数几率(逻辑)回归公式推导
  13. sum-ftp-w.sh
  14. linux:账号管理
  15. 黑马程序员-学习日记(单例设计模式的两种类型)
  16. 大数据时代下,数据感知在数据质量管理系统中的应用
  17. Codeblocks下载、安装的详细过程
  18. 电路分析超详细思维导图
  19. vxlan技术是一种什么技术?
  20. 二极管主要特性及伏安特性曲线

热门文章

  1. c++稀疏表sparse table的实现算法(附完整源码)
  2. 经典C语言程序100例之六八
  3. B01_NumPy Ndarray对象(ndarray内容结构,参数,多维,最小维度,dtype参数)
  4. Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引
  5. 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等
  6. JS正则表达式验证数字非常全
  7. php实现父子评论,关于php:将一系列父子关系转换为层次树?
  8. 17.QT-事件处理分析、事件过滤器、拖放事件
  9. 信号量、互斥体和自旋锁
  10. mybatis关联查询