其实还是写一个Demo 比较好

USE tempdb
IF OBJECT_ID( 'dbo.T1' , 'U'
)IS NOT NULL
BEGIN
DROP TABLE dbo.T1;
END;
GO CREATE TABLE dbo.T1
(
id INT ,
productName VARCHAR(200) ,
price MONEY ,
num INT ,
amount INT ,
operatedate DATETIME
)
GO DECLARE @i INT
DECLARE @rand MONEY
DECLARE @date DATETIME
DECLARE @index INT
DECLARE @DateBase INT
SET @date = GETDATE()
SET @i = 1
WHILE ( @i < 15 )
BEGIN
SET @rand = RAND() * 20
SET @index = CAST(RAND() * 3 AS INT)
SET @DateBase = CAST(RAND() * 10 AS INT) INSERT INTO dbo.T1 ( id, productName, price, num, amount, operatedate )
VALUES ( @i, 'product' + CAST (@index AS VARCHAR(10)), @rand, 100,@rand * 100, @date + @DateBase )
SET @i = @i + 1
END SELECT * FROM dbo.T1
order by operatedate

结果集差不多是这样样子,按照时间排序。

跑一句关于ROLLUP和一句CUBE

--ROLLUP
SELECT CASE WHEN GROUPING(operatedate) = 1 THEN '小计'
ELSE CONVERT(VARCHAR(10), operatedate, 120)
END AS 日期, CASE WHEN GROUPING(productName) = 1 THEN '小计'
ELSE productName
END AS 产品名称, SUM(amount) / SUM(num) AS 平均价格, SUM(num) AS 数量,
SUM(amount) AS 金额
FROM dbo.T1
GROUP BY ROLLUP(operatedate, productName)
ORDER BY '日期','产品名称'; --CUBE
SELECT CASE WHEN GROUPING(operatedate) = 1 THEN '小计'
ELSE CONVERT(VARCHAR(10), operatedate, 120)
END AS 日期, CASE WHEN GROUPING(productName) = 1 THEN '小计'
ELSE productName
END AS 产品名称, SUM(amount) / SUM(num) AS 平均价格, SUM(num) AS 数量,
SUM(amount) AS 金额
FROM dbo.T1
GROUP BY CUBE (operatedate, productName)
ORDER BY '日期','产品名称';

为了方便显示是,都按照'日期','产品名称' 进行了排序。贴入Excel 里方便查看结果

可以看到CUB 会多产生关于产品名称的合计。

不要使用以下的两个子句,请替换成GROUP BY CUBE ( );GROUP BY ROLLUP ( );

WITH CUBE

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。指定结果集内不仅包含由 GROUP BY 提供的行,同时还包含汇总行。 GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。 使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。

结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。 由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。

WITH ROLLUP

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。指定结果集内不仅包含由 GROUP BY 提供的行,同时还包含汇总行。 按层次结构顺序,从组内的最低级别到最高级别汇总组。 组的层次结构取决于列分组时指定使用的顺序。 更改列分组的顺序会影响在结果集内生成的行数。

GROUP BY (Transact-SQL)

关于GROUPING SETS 可以参看CareySon 所写的Blog

T-SQL中的GROUP BY GROUPING SETS

GROUPING SETS、CUBE、ROLLUP的更多相关文章

  1. Oracle的rollup、cube、grouping sets函数

    转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...

  2. Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP

    概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...

  3. Oracle中group by 的扩展函数rollup、cube、grouping sets

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

  4. Group by后加rollup、cube、Grouping_Sets的用法区别

    一.相关分析 通常当聚合率和数据量没有大于一定程度时,对于不涉及Rollup.Cube.Grouping_Sets这三种操作的聚合很少出现GC问题.对于Rollup.Cube.Grouping_Set ...

  5. 解析数仓OLAP函数:ROLLUP、CUBE、GROUPING SETS

    摘要:GaussDB(DWS) ROLLUP,CUBE,GROUPING SETS等OLAP函数的原理解析. 本文分享自华为云社区<GaussDB(DWS) OLAP函数浅析>,作者: D ...

  6. Hive高阶聚合函数 GROUPING SETS、Cube、Rollup

    -- GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起 ...

  7. Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...

  8. ROLLUP、CUBE、GROUP BY的使用区别

    1.ROLLUP:根据维度在数据结果集中进行的聚合操作,可多维度SELECT count(*) num,MONTH(register_time) times,`status` FROM `user` ...

  9. sql中 with rollup 、with cube、grouping 统计函数用法

    with rollup .with cube.grouping CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合. ROLLUP 生成的结果集显示了 ...

随机推荐

  1. Android中MenuInflater实例

    我们知道,LayoutInflater是用来实例化整个布局文件,而MenuInflater是用来实例化Menu目录下的Menu布局文件的. 传统意义上的菜单定义需要Override Activity的 ...

  2. c# 调用 CRFs应用程序

    今天想用C#调用crfs,但是老出问题.原因有几点.第一,我对crf不理解,虽然我用cmd跑了一遍,但是根本不理解为什么,而且只是草草看了下参数该输入什么,只是了解了形式,没有了解实质.所以在调用的时 ...

  3. Runtime机制之结构体及操作函数

    一.动态语言 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:具有灵活性,比如:消息转发,方法交换等.它有一个运行时系统Ob ...

  4. 为网站加入Drupal星球制作RSS订阅源

    目前中文 Drupal 星球的版块还未成立,但大家的积极性挺高,不少站长都已经调整好自己的网站,生成了可供Drupal Planet 使用的RSS订阅源. 如果你也想让网站做好准备,可以不必再花上不少 ...

  5. hadoop的live node为0

    1.重新格式化namenode cd ~ rm -rf name mkdir name rm -rf hadoop-2.7.2/logs/ mkdir hadoop-2.7.2/logs/ hadoo ...

  6. 实时显示GetLastError值

    在Watch窗口中输入$err,hr 自动显示上个函数返回值

  7. Redis 1:简介

    导读:在今日开讲的项目中,用到了redis数据库.老听大家在说,我都不知道是个啥玩意儿.然后这两天在准备知识分享的事儿,我先大概了解了解,然后讲的时候,能有点共鸣.所以,本篇博客,是在自己跟读完MVA ...

  8. [drp 4] 使用dom4j,读取XML数据,保存至数据库

    导读:上篇文章介绍了用XML文件配置数据库的连接,然后通过读取XML文件连接数据库的内容,本篇博客介绍读取XML文件,进行数据持久化的操作.PS:从某种意义上来说,经过Scheme校正的XML文件,本 ...

  9. JavaScript设计模式

    -->面向对象中的23种设计模式简介 最近看了一本书,推荐给大家<JavaScript设计模式与开发实践>图灵出版社的,讲的非常棒! 详细讲解了js开发中常用的14种设计模式,有很多 ...

  10. oracle 如何恢复误删的表记录数据

    --开启行移动功能 ALTER TABLE tablename ENABLE row movement ; --恢复表数据,时间为删除或修改的时间点 flashback table tablename ...