1.创建表 Staff

CREATE TABLE [dbo].[Staff]([ID] [int] IDENTITY(1,1) NOT NULL,[Name] [varchar](50) NULL,[Sex] [varchar](50) NULL,[Department] [varchar](50) NULL,[Money] [int] NULL,[CreateDate] [datetime] NULL)ON [PRIMARY]

GO

2.为Staff表填充数据

INSERT INTO [dbo].[Staff]([Name],[Sex],[Department],[Money],[CreateDate])SELECT 'Name1','男','技术部',3000,'2011-11-12'

UNION ALL

SELECT 'Name2','男','工程部',4000,'2013-11-12'

UNION ALL

SELECT 'Name3','女','工程部',3000,'2013-11-12'

UNION ALL

SELECT 'Name4','女','技术部',5000,'2012-11-12'

UNION ALL

SELECT 'Name5','女','技术部',6000,'2011-11-12'

UNION ALL

SELECT 'Name6','女','技术部',4000,'2013-11-12'

UNION ALL

SELECT 'Name7','女','技术部',5000,'2012-11-12'

UNION ALL

SELECT 'Name8','男','工程部',3000,'2012-11-12'

UNION ALL

SELECT 'Name9','男','工程部',6000,'2011-11-12'

UNION ALL

SELECT 'Name10','男','工程部',3000,'2011-11-12'

UNION ALL

SELECT 'Name11','男','技术部',3000,'2011-11-12'

GROUP BY 分组查询, 一般和聚合函数配合使用

SELECT [DEPARTMENT],SEX, COUNT(1)FROM DBO.[STAFF]

GROUP BY SEX, [DEPARTMENT]

该段SQL是用于查询   某个部门下的男女员工数量 其数据结果如下

开销比较大

GROUPING SETS

使用 GROUPING SETS 的 GROUP BY 子句可以生成一个等效于由多个简单 GROUP BY 子句的 UNION ALL 生成的结果集,并且其效率比 GROUP BY 要高,SQL Server 2008引入。

1.使用GROUP BY 子句的 UNION ALL 来统计 Staff 表中的性别、部门、薪资、入职年份

SET STATISTICS IO ON

SET STATISTICS TIME ON

SELECT N'总人数' ,'',COUNT(0) FROM [DBO].[STAFF]

UNION ALL

SELECT N'按性别划分', SEX,COUNT(0) FROM [DBO].[STAFF] GROUP BYSEXUNION ALL

SELECT N'按部门统计',[DEPARTMENT],COUNT(0) FROM [DBO].[STAFF] GROUP BY [DEPARTMENT]

UNION ALL

SELECT N'按薪资统计',CONVERT(VARCHAR(10),[MONEY]),COUNT(0) FROM [DBO].[STAFF] GROUP BY [MONEY]

UNION ALL

SELECT N'按入职年份',CONVERT(VARCHAR(10),YEAR([CREATEDATE])),COUNT(0) FROM [DBO].[STAFF] GROUP BY YEAR([CREATEDATE])

2.换成GROUPING SETS的写法

SET STATISTICS IO ON

SET STATISTICS TIME ON

GO

SELECT (CASE

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=15 THEN N'总人数'

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=7 THEN N'按性别划分'

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=11 THEN N'按部门统计'

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=13 THEN N'按薪资统计'

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=14 THEN N'按入职年份'

END),

(CASE

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=15 THEN ''

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=7 THENSEXWHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=11 THEN [DEPARTMENT]

WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=13 THEN CONVERT(VARCHAR(10),[MONEY])WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=14 THEN CONVERT(VARCHAR(10),YEAR([CREATEDATE]))END)

,COUNT(1)FROM DBO.[STAFF]

GROUP BY GROUPING SETS (SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]),())

从上述结果中可以看出,采用UNION ALL 是多次扫描表,并将扫描后的查询结果进行组合操作,会增加IO开销,减少CPU和内存开销。

采用GROUPING SETS 是一次性读取所有数据,并在内存中进行聚合操作生成结果,减少IO开销,对CPU和内存消耗增加。但GROUPING SETS 在多列分组时,其性能会比group by高。

这里扫描四次是因为我 GROUP BY GROUPING SETS (SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]),()) 了四列

ROLLUP与CUBE

ROLLUP与CUBE  按一定的规则产生多种分组,然后按各种分组统计数据

ROLLUP与CUBE 区别:

CUBE 会对所有的分组字段进行统计,然后合计。

ROLLUP 按照分组顺序,对第一个字段进行组内统计,最后给出合计。

下面看我查询

SELECT

CASE WHEN (GROUPING(SEX) = 1) THEN '统计-ROLLUP'

ELSE ISNULL(SEX, 'UNKNOWN')END ASSEX ,COUNT(0)FROM DBO.[STAFF]

GROUP BY SEX WITHROLLUPSELECT

CASE WHEN (GROUPING(SEX) = 1) THEN '统计-CUBE'

ELSE ISNULL(SEX, 'UNKNOWN')END ASSEX ,COUNT(0)FROM DBO.[STAFF]

GROUP BY SEX WITH CUBE

看不出差别,我们再加一列

SELECT

CASE WHEN (GROUPING(SEX) = 1) THEN '统计-ROLLUP'

ELSE ISNULL(SEX, 'UNKNOWN')END ASSEX ,CASE WHEN (GROUPING([DEPARTMENT]) = 1) THEN '统计-ROLLUP'

ELSE ISNULL([DEPARTMENT], 'UNKNOWN')END AS [DEPARTMENT],COUNT(0)FROM DBO.[STAFF]

GROUP BY SEX,[DEPARTMENT] WITHROLLUPSELECT

CASE WHEN (GROUPING(SEX) = 1) THEN '统计-CUBE'

ELSE ISNULL(SEX, 'UNKNOWN')END ASSEX ,CASE WHEN (GROUPING([DEPARTMENT]) = 1) THEN '统计-CUBE'

ELSE ISNULL([DEPARTMENT], 'UNKNOWN')END AS [DEPARTMENT],COUNT(0)FROM DBO.[STAFF]

GROUP BY SEX,[DEPARTMENT] WITH CUBE

可以看出 使用 ROLLUP 会先统计分组下的,然后在对GROUP BY的第一列字段进行统计,最后计算总数,而 CUBE 则是先分组统计,然后统计GRUOP BY 的每个字段,最后进行汇总。

http://www.cnblogs.com/woxpp/p/4688715.html

mysql group by cube_SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE相关推荐

  1. SQL SERVER 关于with cube ,with rollup 和 grouping sets、group by

    GROUPING 运算符 with cube with rollup grouping sets with cube cube运算符在 SELECT 语句的 GROUP BY 子句中指定.该语句的选择 ...

  2. SQL Server里Grouping Sets的威力

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

  3. mysql group by cube_SparkSQL 中group by、grouping sets、rollup和cube方法详解

    在平时的工作中,经常有按照不同维度筛选和统计数据的需求.拿视频会员订单数据来说吧,运营人员要查看深圳市的成功下单数或则深圳市某一种产品的成功下单数或者某一种产品的所有成功下单数时,每天的订单数又很大, ...

  4. mysql grouping sets_Spark--Spark多维分析cube/rollup/grouping sets/group by

    概念简述 group by:主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录.可以添加聚合函数. grouping sets:对分组集中指定的组表达式的每个子集执行group ...

  5. MYSQL数据分组(十三)GROUP BY

    MySQL GROUP BY子句 GROUP BY子句是 SELECT 语句的可选部分,它将一组行记录按列或表达式的值分组成摘要行记录.GROUP BY子句返回每个分组的一个行记录.换句话说,它减少了 ...

  6. mysql group by cube_group by、grouping sets、with rollup、with cube方法

    场景 在编写报表的 sql 脚本的时候,可能会遇到多维度组合的情况,例如下面的情况.常规的做法是编写不同维度组合的 sql ,然后再使用 union all 进行全集(当分组维度数量比较多的时候,un ...

  7. T-SQL中的GROUP BY GROUPING SETS

    最近遇到一个情况,需要在内网系统中出一个统计报表.需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 200 ...

  8. mysql grouping sets_SQL Server GROUPING SETS

    在本教程中,将学习如何使用SQL Server GROUPING SETS生成多个分组集. 设置销售摘要表 为了方便演示,下面创建一个名为sales.sales_summary的新表. SELECT ...

  9. SAP WM中阶为多个TR创建了Group后将TR从Group里删除?

    SAP WM中阶为多个TR创建了Group后将TR从Group里删除? SAP WM 2-Step Picking流程里,需要为多个TR或者交货单创建组,然后去对该Group执行集中拣配和后续Allo ...

最新文章

  1. centos7 安装 oracle 11G
  2. r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf
  3. c语言单链表功能,[数据结构]单链表(C语言)的各种功能
  4. zookeeper资料
  5. 洞泾机器人园区地址_2020年4月上海市北新泾商圈写字楼市场租赁情况
  6. nyoj20吝啬得过度(DFS)
  7. 如何更改微信标签名字_微信如何设置备注及标签 来学习吧
  8. Eclipse使用技巧--设置编辑器背景护眼色和设置字体
  9. 计算机一直进入安全模式开机,电脑启动时自动进入安全模式怎么办
  10. 生成订单30分钟未支付,则自动取消,该怎么实现?
  11. 17_AOP入门准备_Salay案例(利用动态代理)
  12. 前端开发入门 --摘自慕克网大漠穷秋
  13. 如何顺利接手一个中途的项目
  14. 2、测试面试题总结整理
  15. Java 优秀博主 (合集)
  16. 实现GB28181平台级联到海康平台的级联
  17. 直播数据采集的10个经典方法
  18. 关于音视频的一些知识(demux、filter等)
  19. 不得不看的五个堪称神器的在线网站工具
  20. 房产门户企业织梦模板/DedeCMS房地产楼盘网站模板下载

热门文章

  1. java 包装类_Java中的包装类
  2. OpenShift 4 - 容器应用备份和恢复
  3. Vue 3 最新进展
  4. 张杰和机器人_科学艺术两开花,国内首个机器人乐队诞生有什么重要的意义?...
  5. vue router children 路由变了 组件没变_Vue.js从零开始——路由(2)
  6. css修改图片形状,css定位图形改(原创)
  7. php无限极 left right,php无限极分类实现的两种解决方法
  8. php mysql 网站_实验六:MYSQL+PHP的网站搭建
  9. c语言程序设计基础的考试题,c语言程序设计基础的考试题.doc
  10. java mcv_Spring和SpringMCV配置