【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-09-30 13:41:33

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

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中汇总功能的使用GROUPING,ROLLUP和CUBE

第一次看到这样的SQL语句,看不懂,其中用到了下面的不常用的 聚集函数:GROUPING 用于汇总数据用的运算符: ROLLUP SELECT CASE GROUPING(o.customerid) WHEN 0 THEN o.customerid ELSE  '(Total)' END AS AllCustomersSummary, CASE GROUPING(od.orderid) WHEN 0 THEN od.orderid ELSE -1 END AS IndividualCustome

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,'

ROLLUP 与 CUBE 运算符的使用

    对于数据的汇总,是数据库经常用到的任务之一,除了我们通常使用的GROUP BY分组配合聚合函数对数据汇总,以及使用UNION ALL 对数据汇总之外,SQL还提供了 GROUP BY Col1,Col2.. WITH CUBE | ROLLUP,以及COMPUTE BY 等汇总方式,本文主要介绍了使用CUBE 与ROLLUP运算符来实现数据的分级汇总. IF OBJECT_ID('tb') IS NOT NULL  DROP TABLE tb; GO   CREATE TABLE tb

Oracle学习(八) PL/SQL简介,基本程序结构和语句

1.变量 2.常量 3.基本程序结构和语句 PL/SQL能够驻留在Oracle数据库服务器和Oracle开发工具两个环境中.在这两个环境中,PL/SQL引擎 接受任何PL/SQL块和子程序作为输入,引擎执行过程语句将SQL语句发送给Oracle服务器的SQL语句执行 器执行. 1.PL/SQL变量 (1)变量的声明: 变量通常是在PL/SQL块的声明部分定义的,每一个变量都有一个特定的类型. 变量定义的基本格式为: <变量名> <数据类型>[(宽度):=<初始值>] 如

sqlserver-关于SQL SERVER如何获取执行过的语句

问题描述 关于SQL SERVER如何获取执行过的语句 我知道sqldiag和sql server profiler好像是可以获取SQL SERVER执行过的语句的,版本为2005,但是前者在试验时,未能在相关trc文件获取历史语句,后者倒是能在监视器获取到,但由于鄙人是单独下载的,有点问题,不能保存结果到表或者文件(蛋疼),但是profiler不知道是不是可以自动生成可分析的trc文件?或者能自动保存啥的?小弟需要隔一段时间自动进行一次规则过滤分析,所以不能采用手动保存.坐等专家解答..十万火

为什么ASP中执行动态SQL总报错误信息?提示语句语法错误_数据库相关

问:为什么ASP中执行动态SQL总报错误信息?提示语句语法错误 答: 有时候写ASP用conn.execute(sql)查询.更新.插入Access数据库数据时,明明正确的语句却往往会显示sql语句错误,相当恼火,特进行了归纳,可适当为字段添加"["."]"解决: 复制代码 代码如下: 例1:select * from a  如出现错误,可改为:select * from [a]  例2:UPDATE [user] SET password = '"&am

sql 对相对数据进行分组查询语句

sql 对相对数据进行分组查询语句 /* | section | province | area   | zone | postcode | cardtype                 | telco  | | 1879728 | 青海      | 共和         | 0974 | 813000   | 移动187卡                   | 移动   | | 1879741 | 湖南      | 长沙         | 0731 | 410000   | 移动1

深入浅出SQL系列教程之SQL语言简介

SQL是结构化查询语言(Structured Query Language)的缩写.这种语言允许我们对数据库进行复杂的操作.SQL语言的使用范围非常广泛.许多数据库产品都支持SQL语言,这意味着如果我们学会了SQL语言,我们可以把这种知识运用到MS Access 或 SQL Server, Oracle, DB2以及非常多的其它数据库中. SQL语言运用在关系型数据库中.一个关系型数据库把数据存储在表(也称关系)中.每个数据库的主要组成就是一组表.每个表又由一组记录组成--每条记录在表中有相同的