【T-SQL系列】WITH ROLLUP、WITH CUBE、GROUPING语句的应用

原文:【T-SQL系列】WITH ROLLUP、WITH CUBE、GROUPING语句的应用

CUBE 和 ROLLUP 之间的区别在于:
CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。
CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。

CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
GROUPING:
当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。

需要注意的是,使用有 WITH ROLLUP 子句的 GROUP BY 语句时,不能再使用 ORDER BY 语句对结果集进行排序,如果对返回的结果顺序不满意,需要应用程序获得结果后在程序中进行排序。
示例:

DECLARE @T TABLE
    (
      名称 VARCHAR(10) ,
      出版商 VARCHAR(10) ,
      价格1 INT ,
      价格2 INT
    )
INSERT  @T
        SELECT  ‘a‘ ,
                ‘北京‘ ,
                11 ,
                22
        UNION ALL
        SELECT  ‘a‘ ,
                ‘四川‘ ,
                22 ,
                33
        UNION ALL
        SELECT  ‘b‘ ,
                ‘四川‘ ,
                12 ,
                23
        UNION ALL
        SELECT  ‘b‘ ,
                ‘北京‘ ,
                10 ,
                20
        UNION ALL
        SELECT  ‘b‘ ,
                ‘昆明‘ ,
                20 ,
                30

SELECT  *
FROM    @T       

--WITH CUBE
SELECT  名称 ,
        出版商 ,
        SUM(价格1) AS 价格1 ,
        SUM(价格2) AS 价格2 ,
        GROUPING(名称) AS CHECK名称 ,
        GROUPING(出版商) AS CHECK出版商
FROM    @T
GROUP BY 名称 ,
        出版商
        WITH CUBE

--WITH ROLLUP
SELECT  名称 ,
        出版商 ,
        SUM(价格1) AS 价格1 ,
        SUM(价格2) AS 价格2
FROM    @T
GROUP BY 名称 ,
        出版商
        WITH ROLLUP   

--GROUPING
SELECT  CASE WHEN ( GROUPING(名称) = 1 ) THEN ‘总计‘
             ELSE ISNULL(名称, ‘UNKNOWN‘)
        END AS 名称 ,
        CASE WHEN ( GROUPING(出版商) = 1 ) THEN ‘小计‘
             ELSE ISNULL(出版商, ‘UNKNOWN‘)
        END AS 出版商 ,
        SUM(价格1) AS 价格1 ,
        SUM(价格2) AS 价格2
FROM    @T
GROUP BY 名称 ,
        出版商
        WITH ROLLUP 

WITH CUBE 结果集:

WITH ROLLUP 结果集:

GROUPING结果集:

时间: 2024-10-07 07:05:04

【T-SQL系列】WITH ROLLUP、WITH CUBE、GROUPING语句的应用的相关文章

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

原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用法,这些函数可以理解为GroupBy分组函数封装后的精简用法,相当于多个union all 的组合显示效果,但是要比 多个union all的效率要高. 其实这些函数在时间的程序开发中应用的并不多,至少在我工作的多年时间中没用过几次,因为现在的各种开发工具/平台都自带了这些高级分组统计功能,使用的方

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

with rollup .with cube.grouping CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合. ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合. grouping: 当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0. ----------------------------------------------------

SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、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, [Sex] [varchar](50) NULL, [Department] [varchar](50) NULL, [Money] [int] NULL, [CreateDate] [date

SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

原文:SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 先来创建一个测试表 1 USE [tempdb] 2 GO 3 4 CREATE TABLE #temptb(id INT ,NAME VARCHAR(200)) 5 GO 6 7 INSERT INTO [#temptb] ( [id], [NAME] ) 8 SELECT 1,'中

转:GROUPING SETS、ROLLUP、CUBE

转:http://blog.csdn.net/shangboerds/article/details/5193211 大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那么本文不适合你.还记得当初学习SQL的时候,总是理解不了GROUP BY的作用,经过好长时间才终于明白GROUP BY的真谛.当然,这和我本人笨也有关系,但是GROUP BY的确不好理解.本文将介绍DB2 GROUPING SETS.ROLLUP.CUBE的使用方法,这些关键字比GROUP BY更难

Oralce 高级 sql 之 rollup 与 cube

在 oracle sql 查询中,oracle 提供了一些高级功能能够简化 sql 查询语句以及提高查询性能.下面将介绍 rollup,cube的用法与区别. 1. rollup rollup 能够在 select 语句中计算指定分组字段的多个层次的小计以及合计. rollup 非常容易使用并且非常高效. rollup 从右到左扫描分组字段, 逐步创建更高级别的小计. 最后再创建一行总计. rollup 将创建 n + 1 个层次(级别)的小计, n 指的是 rollup 中的字段数. 1.1

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

Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollup.cube.grouping sets,分别介绍如下: 1.rollup 对数据库表emp,假设其中两个字段名为a,b,c. 如果使用group by rollup(a,b),首先会对(a,b)进行group by ,然后对 a 进行 group by ,最后对全表进行 group by 操作. 如下查询结果: 查询语句 Select deptno,job,sum(sal) from emp group by r

高级聚合函数rollup(),cube(),grouping sets()

rollup(),cube(),grouping sets() 上面这几个函数,是对group by分组功能做的功能扩展. a.rollup() 功能:在原结果基础上追加一行总合计记录 rollup(字段1,字段2)会追加按字段1进行的合计记录, 最后再追加一个总合计记录 select deptno,count(*) from emp group by rollup(deptno); select deptno,job,count(*) from emp group by rollup(dept

LINQ to SQL 系列五 grouping having

在linq to sql中grouping很简单.很灵活,但是如果不注意则会中了Microsoft的糖衣炮弹. 本文使用的数据模型如下图: 1. 用linq to sql写一个最简单的group语句:查询Students表并按ClassID分组,输出每个班级的学生数.下面的代码是糖衣版. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 static void Main(string[] args) {     using (var