grouping sets主要是用来合并多个分组的结果。

对于员工目标业绩表‘businessTarget’:

employeeId    targetDate    idealDistAmount
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
10091 2016-07 20000
10290 2016-08 20000
10291 2016-08 20000
9058 2016-08 10000
9792 2016-07 20000
9865 2016-07 20000

如果需要分别对上表employeeId,targetDate,(employeeId,targetDate)分别进行group by,代码如下:

 select  employeeId,null,sum(idealDistAmount)
from businessTarget
group by employeeId
union all
select null,targetDate,sum(idealDistAmount)
from businessTarget
group by targetDate
union all
select employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by employeeId,targetDate

结果:

 employeeId    (无列名)    (无列名)
9058 NULL 10000
9792 NULL 20000
9865 NULL 20000
10091 NULL 20000
10098 NULL 100000
10099 NULL 80000
10100 NULL 80000
10101 NULL 100000
10102 NULL 50000
10103 NULL 50000
10104 NULL 50000
10118 NULL 50000
10130 NULL 507689
10290 NULL 20000
10291 NULL 20000
NULL 2016-05 1067689
NULL 2016-07 60000
NULL 2016-08 50000
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
9792 2016-07 20000
9865 2016-07 20000
10091 2016-07 20000
9058 2016-08 10000
10290 2016-08 20000
10291 2016-08 20000

如果我们运用grouping sets来指定多个group by 选项,

就可以通过一条select 语句实现复杂繁琐的多条select 语句的查询,并且更加的高效。
 select  employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by
grouping sets
(
(employeeId),
(targetDate),
(employeeId,targetDate),()
)

结果:

 employeeId    targetDate    (无列名)
10098 2016-05 100000
10099 2016-05 80000
10100 2016-05 80000
10101 2016-05 100000
10102 2016-05 50000
10103 2016-05 50000
10104 2016-05 50000
10118 2016-05 50000
10130 2016-05 507689
NULL 2016-05 1067689
9792 2016-07 20000
9865 2016-07 20000
10091 2016-07 20000
NULL 2016-07 60000
9058 2016-08 10000
10290 2016-08 20000
10291 2016-08 20000
NULL 2016-08 50000
NULL NULL 1177689
9058 NULL 10000
9792 NULL 20000
9865 NULL 20000
10091 NULL 20000
10098 NULL 100000
10099 NULL 80000
10100 NULL 80000
10101 NULL 100000
10102 NULL 50000
10103 NULL 50000
10104 NULL 50000
10118 NULL 50000
10130 NULL 507689
10290 NULL 20000
10291 NULL 20000

除了grouping sets从属子句,我们还可以运用另外一个从属子句同样可以得到这样的结果,

那就是cube从属子句,代码如下:

 select  employeeId,targetDate,sum(idealDistAmount)
from businessTarget
group by
cube(employeeId,targetDate)--等同于grouping sets((employeeId),(targetDate),(employeeId,targetDate),())
order by employeeId

此三种方法运行得到的结果是一样的。

grouping sets从属子句的运用的更多相关文章

  1. TSQL 分组集(Grouping Sets)

    分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...

  2. SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE

    1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...

  3. Grouping Sets:CUBE和ROLLUP从句

    在上一篇文章里我讨论了SQL Server里Grouping Sets的功能.从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组.但如果像从所给的列集里想要有所有可能的分布——即所谓的 ...

  4. SQL Server里Grouping Sets的威力

    在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务 ...

  5. GROUPING SETS、CUBE、ROLLUP

    其实还是写一个Demo 比较好 USE tempdb IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; G ...

  6. 介绍一种非常好用汇总数据的方式GROUPING SETS

    介绍 对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环.我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包含多种不同的汇总结果,可能会比较麻烦.我将举 ...

  7. Hive高级聚合GROUPING SETS,ROLLUP以及CUBE

    scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...

  8. GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例

    oracle group by中rollup和cube的区别: Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句.CUBE ROLLUP 是用于统计数据的. 实验 ...

  9. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

随机推荐

  1. JVM 架构解读

    每个Java开发人员都知道字节码由JRE(Java运行时环境)执行.但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它.作为开发人员,我们应 ...

  2. Java概述

    Java概述 一.前奏(常见的DOS命令) dir:列出当前目录下的文件以及文件夹 md:创建目录(文件夹) rd:删除目录 cd:进入指定目录 cd..:退出当前目录,返回到上一级目录 cd\:退回 ...

  3. spider RPC框架的需求来源与特性介绍(一)

    spider RPC 特性介绍 spider RPC 性能测试 spider RPC 入门指南 spider RPC 配置文件参考 spider RPC 开发指南 spider RPC 安全性 spi ...

  4. javascript的理解及经典案例

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...

  5. iOS 开发 -----公司测试打包上传流程

    打包iOS应用程序 如果想要将做的iOS应用程序安装到自己的iOS设备上测试.或者安装到别人的iOS设备上,或者想发布到App Store中,先要给应用签名.签名就要有证书,这就需要申请证书的过程了. ...

  6. iOS:小技巧(不断更新)

    记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...

  7. Cell右滑 多个编辑选项栏

    简单粗暴,一看就能明白 关于右滑cell,能滑出来两个以上的选项栏,可以如下这么做,但是要注意下面的注意事项,就是关于iOS8前后的问题,注释写的很清楚了.可以直接复制到自己的代码里看的会更明白. / ...

  8. Xamarin Android Activity全屏的两种方式

    方式一 直接在Activity的Attribute中定义 如下 在 MainActivity 中 [Activity(Label = "app", MainLauncher = t ...

  9. 有主线程发送message给子线程

    通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程.比如下面示例: package com.example.testlistener; import ...

  10. Appfuse:扩展自己的GenericManager

    通过代码生成机制的appfuse访问数据都通过GenericManager来实现,GenericManager默认提供了以下几个方法: package org.appfuse.service; imp ...