听音乐,写博客,在博客上蛋比,多惬意啊!这回学一下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正是满足这种需求的,剔除你不想看到的 [空 *] 这种组合。