rollup与cube函数

1 Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 2 用GROUP BY GROUPING SETS来代替GROUP BY CUBE。你可以应用来指定你感兴趣的总数组合。因为它不必计算它不需要集合(也不会产生太多结果),所以对SQL引擎来说更为高效。 其格式为: GROUP BY GROUPING SETS ((list), (list) ... ) 这里(list)是圆括号中的一个列序列,这个组合生成一个总数。要增加一个总和,必须增加一个(NUlL)分组集。 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 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dyufei/archive/2009/11/12/4801283.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值