T-SQL中的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,如下:
T-SQL中的GROUP BY GROUPING SETS相关推荐
- 解决数据倾斜一:RDD执行reduceByKey或则Spark SQL中使用group by语句导致的数据倾斜
一:概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...
- oracle中having的用法,深入浅析SQL中的group by 和 having 用法
一.sql中的group by 用法解析: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". 作用:通过一定的规则将一个数据集划分成 ...
- 【转】SQL中where, group by, having的用法和区别
group by,where,having 是数据库查询中最常用的几个关键字.在工作中,时常用到,那么,当一个查询中使用了where ,group by ,having及聚集函数时 ,执行顺序是怎么样 ...
- 选择列表中的列'sc.cno'无效,因为该列没有包含在聚合函数或者group by 字句中《SQL中的group by该怎么用?》
1.SQL Server中,子查询不能返回多个值 2.子查询中不能包含ORDER BY子句 3.group by 可以将查询结果按某一列或多列的值进行分组.group by 一般是和聚合函数一起搭配使 ...
- sql中不用group by分组进行计总
废话不多说,直接上代码 create table test(keyid int identity,sort varchar(10),qty int ) insert into test(qty,sor ...
- 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列. 如果使 ...
- 深入理解 SQL 中的 Grouping Sets 语句
前言 SQL 中 Group By 语句大家都很熟悉,根据指定的规则对数据进行分组,常常和聚合函数一起使用. 比如,考虑有表 dealer,表中数据如下: id (Int) city (String) ...
- oracle group by 两项,Oracle中group by 的扩展函数rollup、cube、grouping sets
Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...
- 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,[ ...
最新文章
- Java基本数据类型转换|字符和字符串
- BUZZER Driver
- Ubuntu16.04中的可重定位目标文件
- zynq上NEON进行fft
- Ubuntu文件的复制、移动和删除命令
- logging通过配置文件设置同时输出到终端与文件
- 【深度学习】修改每张人像---ImageNet 的衰落
- 1000:入门测试题目
- zigbee物联网模块市场:LTE标准Cat.1和nbiot无线通信模块差异
- 代理模式用来初始化的延迟下载
- 机器学习基石13-Hazard of Overfitting
- 西瓜书《机器学习》线性模型 对数几率(逻辑)回归公式推导
- sum-ftp-w.sh
- linux:账号管理
- 黑马程序员-学习日记(单例设计模式的两种类型)
- 大数据时代下,数据感知在数据质量管理系统中的应用
- Codeblocks下载、安装的详细过程
- 电路分析超详细思维导图
- vxlan技术是一种什么技术?
- 二极管主要特性及伏安特性曲线
热门文章
- c++稀疏表sparse table的实现算法(附完整源码)
- 经典C语言程序100例之六八
- B01_NumPy Ndarray对象(ndarray内容结构,参数,多维,最小维度,dtype参数)
- Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引
- 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等
- JS正则表达式验证数字非常全
- php实现父子评论,关于php:将一系列父子关系转换为层次树?
- 17.QT-事件处理分析、事件过滤器、拖放事件
- 信号量、互斥体和自旋锁
- mybatis关联查询