重庆思庄Oracle、Redhat认证学习论坛

标题: sql中的cube和rollup [打印本页]

作者: 5dm    时间: 2012-10-25 10:11
标题: sql中的cube和rollup

要使用CUBE,首先要了解GROUP BY。
其实CUBE和ROLLUP区别不太大,只是在基于GROUP BY 子句创建和汇总分组的可能的组合上有一定差别,CUBE将返回的更多的可能组合。如果在GROUP BY子句中有N个列或者是有N个表达式的话,结果集上会返回2的N-1次幂个可能组合。

CUBE和ROLLUP之间的区别在于:     
    
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。  

ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合
    
ROLLUP就是将GROUP BY后面的第一列名称求总和,而其他列并不要求
而CUBE则会将每一个列名称都求总和  

一个例子,首先用ROLLUP

查询语句:

Select cust_id,product_code,sum(qty) as quantity

From invoices Where cust_id IN (4,5)

Group By cust_id, product_code

WITH Rollup Order By cust_id

查询结果:
cust_id         product_code         quantity
-------        --------------         -------
NULL            NULL                      10
4                 5                                 3
4                 6                                 3
4                 NULL                         6
5                 5                                 4
5                 NULL                         4
第一行是4,5买的所有产品的数量
第二行是4买5产品的数量
第三行是4买6产品的数量
第四行是4买所有产品的数量
第五行是5买5产品的数量
第六行是5买所有产品的数量

如果查询语句中的ROLLUP关键字更改为CUBE,就会多出有关产品的信息
查询结果:
cust_id         product_code         quantity
-------        --------------         -------
NULL            NULL                       10
NULL            5                               7
NULL            6                               3
4                    5                               3
4                    6                               3
4                    NULL                       6
5                    5                               4
5                    NULL                       4
第2行是所有顾客买5产品的数量
第3行是所有顾客买6产品的数量
  
ROLLUP操作的结果集具有类似 COMPUTE BY所返回结果集的功能;然而ROLLUP 具有下列优点:     
    
ROLLUP返回单个结果集;COMPUTE     BY返回多个结果集,而多个结果集会增加应用程序代码的复杂性。   
   
ROLLUP可以在服务器游标中使用;COMPUTE BY不可以。   
    
有时,查询优化器为ROLLUP生成的执行计划比为 COMPUTE BY 生成的更为高效。


作者: 5dm    时间: 2012-10-25 10:14

个人感觉还是有点复杂


作者: monkeybird    时间: 2012-10-25 11:31

个人感觉岂止有点复杂






欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2