ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。

下面是 CUBE 和 ROLLUP 之间的具体区别:

  • CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
  • ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。

    ROLLUP 优点:

    • (1)ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
    • (2)ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。
    • (3)有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

下面对比一下GROUP BY 、CUBE 和  ROLLUP后的结果

创建表:

CREATE TABLE DEPART 
(部门 char(10),员工 char(6),工资 int)

INSERT INTO DEPART SELECT 'A','ZHANG',100 
INSERT INTO DEPART SELECT 'A','LI',200 
INSERT INTO DEPART SELECT 'A','WANG',300 
INSERT INTO DEPART SELECT 'A','ZHAO',400 
INSERT INTO DEPART SELECT 'A','DUAN',500 
INSERT INTO DEPART SELECT 'B','DUAN',600 
INSERT INTO DEPART SELECT 'B','DUAN',700

部门         员工         工资

A             ZHANG     100 
A             LI             200 
A             WANG      300 
A             ZHAO      400 
A             DUAN      500 
B             DUAN      600 
B             DUAN      700

(1)GROUP BY

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工

结果:

A             DUAN      500 
B             DUAN      1300 
A             LI        200 
A             WANG      300 
A             ZHANG     100 
A             ZHAO      400

(2)ROLLUP

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY  部门,员工  WITH ROLLUP

结果如下:

A             DUAN       500 
A             LI             200 
A             WANG      300 
A             ZHANG     100 
A             ZHAO       400 
A             NULL        1500 
B             DUAN       1300 
B             NULL       1300 
NULL       NULL        2800

ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。

等价于下列SQL语句

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 
union 
SELECT 部门,'NULL',SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY  部门 
union 
SELECT 'NULL','NULL',SUM(工资)AS TOTAL 
FROM DEPART

结果:

A             DUAN      500 
A             LI           200 
A             NULL      1500 
A             WANG      300 
A             ZHANG     100 
A             ZHAO       400 
B             DUAN      1300 
B             NULL       1300 
NULL       NULL        2800

(3)CUBE

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH CUBE

结果:

A             DUAN      500 
A             LI           200 
A             WANG      300 
A             ZHANG     100 
A             ZHAO      400 
A             NULL      1500 
B             DUAN      1300 
B             NULL      1300 
NULL    NULL         2800 
NULL    DUAN        1800 
NULL    LI               200 
NULL    WANG       300 
NULL    ZHANG       100 
NULL    ZHAO         400

CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 部门,员工 WITH CUBE

等价于下列的SQL语句:

SELECT 部门,员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY  部门,员工  WITH ROLLUP

union

SELECT 'NULL',员工,SUM(工资)AS TOTAL 
FROM DEPART 
GROUP BY 员工

结果:

NULL    NULL    2800 
A             NULL    1500 
A             DUAN      500 
A             LI        200 
A             WANG      300 
A             ZHANG     100 
A             ZHAO      400 
B             NULL    1300 
B             DUAN      1300 
NULL    DUAN      1800 
NULL    LI             200 
NULL    WANG      300 
NULL    ZHANG     100 
NULL    ZHAO      400

不用讲了吧,一对比结果就全明白了。

ROLLUP ( )

生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。
 
SELECT a, b, c, SUM ( <expression> )
  FROM T
  GROUP BY ROLLUP (a,b,c);
   
 
会为 (a, b, c)、 (a, b) 和 (a) 值的每个唯一组合生成一个带有小计的行。 
还将计算一个总计行。
 
 
列是按照从右到左的顺序汇总的。
列的顺序会影响 ROLLUP 的输出分组,而且可能会影响结果集内的行数。
 
CUBE ( )
 
生成简单的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。
   
SELECT a, b, c, SUM (<expression>)
FROM T
GROUP BY CUBE (a,b,c);
 
 
会为 (a, b, c)、 (a, b)、 (a, c)、 (b, c)、 (a)、 (b) 和 (c) 值的每个唯一组合生成一个带有小计的行,还会生成一个总计行。 
 
列的顺序不影响 CUBE 的输出。

SQL 中ROLLUP 用法的更多相关文章

  1. Sql 中Collate用法

    今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...

  2. sql 中 exists用法

    SQL中EXISTS的用法   比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(S ...

  3. 数据库sql中distinct用法注意事项

    在写sql中去重复等操作,需要用到distinct. 在使用distinct的时候要注意,尤其是在有行列转换的时候.要把sql运行出来看看是不是与你想要的结果一样. 通过自己试验,distinct有从 ...

  4. 详细的SQL中datediff用法

    DATEDIFF 函数 [日期和时间] 功能返回两个日期之间的间隔. 语法DATEDIFF ( date-part, date-expression-1, date-expression-2 ) da ...

  5. Sql中CHARINDEX用法

    CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...

  6. SQL中ISNULL用法示例

    ISNULLSQL查询示例SELECT ISNULL    使用指定的替换值替换 NULL. 语法       :ISNULL ( check_expression , replacement_val ...

  7. sql中table用法

    for c in (select column_value from table(f_split(V_FileID, ','))) loop --若没有填写资格开始结束时间,则填入 select co ...

  8. SQL 中 HAVING 用法

    现在 Student表有 如下数据 现需求如下: 查找每个老师的学生的平均年龄且平均年齿大于12 不使用 HAVING SELECT * FROM (SELECT TeacherID, AVG(Age ...

  9. SQL中的between and

    "between xx and  xx "在SQL中的用法 这个大家都很熟悉,但是当问到是否包含两端的值时,就有点儿不确定了.在W3School网站上,有这样的一段话: 参考:ht ...

随机推荐

  1. Python学习总结14:时间模块datetime & time & calendar (一)

    Python中的常用于处理时间主要有3个模块datetime模块.time模块和calendar模块. 一.time模块 1. 在Python中表示时间的方式 1)时间戳(timestamp):通常来 ...

  2. Ruby操作VBA的注意事项和技巧(1):乱码、获取VBA活动和非活动窗口的名称与路径、文件路径的智能拼接与截取(写入日期)

    1.VBA编辑器复制粘贴出来的代码乱码     解决方法:切换到中文输入模式再复制出来就行了 2.获取VBA活动和非活动窗口的名称与路径 Dim wbpath, filename As String ...

  3. Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)

    一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...

  4. adb devices 显示error

    1.adb kill-server 2.adb start-server

  5. linux 修改端口限制

    1.显示当前临时端口的范围:一般情形下:linux临时端口号范围是(32768,61000)      sysctl  net.ipv4.ip_local_port_range  或     cat ...

  6. 1021: A除以B

    1021: A除以B 时间限制: 1 Sec  内存限制: 128 MB提交: 263  解决: 189[提交][状态][讨论版] 题目描述 本题要求计算A/B,其中A是不超过1000位的正整数,B是 ...

  7. js this 闭包

    var myObject = { value :, increment:function (inc){ ; } }; myObject .increment(); console.log(myObje ...

  8. struts拦截器

    struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...

  9. 夺命雷公狗---DEDECMS----3快速入门之隐藏

    如果我们在工作的时候遇到上操蛋的老板,本来公司是做医疗器械的,但是老板突然老了句我们不做医疗了,我们该做电影网,那么我们可以先将原本的栏目进行修改成隐藏栏目, 主要是预防变态老板突然来句“电影网更不好 ...

  10. android- Auto Monitor Logcat

    启动模拟器的时候弹出窗体: 它实在询问你是否显示logcat视图以便显示此工作空间中的程序信息. 因为如何程序错误,可以从logcat中看到错误的原因,建议选择yes. 单击确定,你会发现多了一个Lo ...