oracle: OCA-047-题解与实验(8)--CUBE和ROLLUP的用法

听音乐,写博客,在博客上蛋比,多惬意啊!吐舌头这回学一下CUBE及ROLLUP在sql语句中的作用(与group by配合使用);

题目:

答案解析:...还是看例子吧,空说不好描述

这个例子网上挺多的,我就随便找了个,不算侵权吧,呵呵。

create table test(sales varchar2(10),dest varchar2(10),revenue number);
insert into test values('smith','hangzhou',1000);
insert into test values('smith','wenzhou',2000);
insert into test values('allen','wenzhou',3000);
insert into test values('allen','wenzhou',4000);
commit;

SQL> select * from test;
 
SALES      DEST          REVENUE
---------- ---------- ----------
smith      hangzhou         1000
smith      wenzhou          2000
allen      wenzhou          3000
allen      wenzhou          4000

上面是准备工作,然后看示例一:

SQL> SELECT sales, nvl(dest,'合计'), SUM(revenue) FROM test GROUP BY CUBE(sales, dest);
 
SALES      NVL(DEST,'合计') SUM(REVENUE)
---------- ---------------- ------------
           合计                    10000
           wenzhou                  9000
           hangzhou                 1000
allen      合计                     7000
allen      wenzhou                  7000
smith      合计                     3000
smith      wenzhou                  2000
smith      hangzhou                 1000
 
8 rows selected


可以看到共有8行,而前两列中,第一列有两个值,第二列有两个值,根据组合情况(包含某列为空的情况)就会有8种,这8种情况是:

[空 空]、[空 wenzhou]、[空 hangzhou]、[allen 空]、[allen wenzhou]、[smith 空]、[smith wenzhou]、[smith hangzhou] 然后group by就根据这8种做聚集求和第三列值。这就是CUBE的含义;

ROLLUP的功能,看下面这个示例二:

SQL> SELECT sales, nvl(dest,'合计'), SUM(revenue) FROM test GROUP BY ROLLUP(sales, dest);
 
SALES      NVL(DEST,'合计') SUM(REVENUE)
---------- ---------------- ------------
allen      wenzhou                  7000            
allen      合计                     7000            
smith      wenzhou                  2000           
smith      hangzhou                 1000         
smith      合计                     3000           
           合计                    10000            
 
6 rows selected


 

看到只有6行了,同理可以知道对应这6种组合,这里就不列举了。所以rollup比cube组合种类要少,少的是[空 wenzhou]、[空 hangzhou]这两种情况,而rollup正是满足这种需求的,剔除你不想看到的 [空 *] 这种组合。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值