SQL 中ROLLUP 用法 (ROLLUP 与CUBE区别)

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

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

CUBE 生成的结果集显示了所选列中值的所有组合的聚合。

ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
ROLLUP 优点:

(1)ROLLUP返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。

(2)ROLLUP可以在服务器游标中使用,而 COMPUTE BY 则不可以。

(3)有时,查询优化器为ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

 

创建表:

CREATETABLE DEPART

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

INSERTINTO DEPART SELECT 'A','ZHANG',100

INSERTINTO DEPART SELECT 'A','LI',200

INSERTINTO DEPART SELECT 'A','WANG',300

INSERTINTO DEPART SELECT 'A','ZHAO',400

INSERTINTO DEPART SELECT 'A','DUAN',500

INSERTINTO DEPART SELECT 'B','DUAN',600

INSERTINTO 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

A: 下面对比一下GROUP BY CUBE   ROLLUP后的结果

1GROUP BY 

SELECT 部门,员工,SUM(工资)AS TOTAL

FROMDEPART

GROUP BY 部门,员工

结果:

A            DUAN      500

B            DUAN      1300

A            LI        200

A            WANG      300

A            ZHANG     100

A            ZHAO      400

2ROLLUP

SELECT 部门,员工,SUM(工资)AS TOTAL

FROMDEPART

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

FROMDEPART

GROUP BY 部门,员工

union

SELECT 部门,'NULL',SUM(工资)AS TOTAL

FROMDEPART

GROUP BY  部门

union

SELECT 'NULL','NULL',SUM(工资)AS TOTAL

FROMDEPART

结果:

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

3CUBE

SELECT 部门,员工,SUM(工资)AS TOTAL

FROMDEPART

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

FROMDEPART

GROUP BY 部门,员工 WITH CUBE

等价于下列的SQL语句:

SELECT 部门,员工,SUM(工资)AS TOTAL

FROMDEPART

GROUP BY  部门,员工 WITH ROLLUP

union

SELECT 'NULL',员工,SUM(工资)AS TOTAL

FROMDEPART

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值