在此使用oracle,oracle 中的用法爲 group by [rollup|cube]( colomn),sql server中的用法爲group by colomn with [rollup|cube]spring
首先要弄明白rollup 和cube,就要知道group by的用法,group by 爲對列進行分組,只展示分組統計的值,而rollup 爲分層次展示,cube爲展示列中全部層次,聽我娓娓道來。sql
一、搭建場地oracle
首先創建一個group_by 表,列值分別爲購買者名稱,購買物品的大類,購買物品的小類,物品以及價格,ide
用戶購買了一些3C以及衣物spa
1 create table group_by ( 2 o_name varchar2(20), 3 o_class varchar2(20), 4 o_item varchar2(20), 5 o_object varchar2(20), 6 o_price int 7 ) 8 9 insert into group_by values('springy','3C','phone','huawei',4000); 10 insert into group_by values('springy','3C','phone','xiaomi',3000); 11 insert into group_by values('springy','3C','computer','mac',10000); 12 insert into group_by values('springy','3C','phone','thinkpad',8000); 13 insert into group_by values('springy','3C','phone','huawei',4000); 14 insert into group_by values('springy','clothes','shoes','adidas',300); 15 insert into group_by values('springy','clothes','shoes','lining',400); 16 insert into group_by values('springy','clothes','pants','jackjones',500); 17 insert into group_by values('stephenson','clothes','shoes','adivon',200); 18 insert into group_by values('stephenson','clothes','shoes','nike',300); 19 insert into group_by values('stephenson','clothes','skirt','nike',300); 20 insert into group_by values('stephenson','clothes','skirt','adidas',400); 21 commit;
二、初識group by3d
此時向咱們緩緩走來的是group by,group by 能夠對數據進行分組求值。code
首先對O_NAME,O_CLASS,O_ITEM進行group by 分組 ,查看購買者購買對應分類物品的價格合計。server
1 select o_name, o_class, o_item, sum(o_price) 2 from group_by 3 group by o_name, o_class, o_item 4 order by o_name, o_class, o_item
咱們能夠看到購買者沒類物品消耗的價格blog
三、rollupit
此時咱們對統計的數據不太理想,除了想看每一個小類,還想看每一個大類,以及他們兩人的消費和
表格畫出來就是這個意思
表3-1
這時,咱們將其與上面group by的進行對比,發現多了這些
表3-2
而這些又是怎麼出來的呢?
這是就回到了開始所說的,rollup爲分層次展示,怎麼個分層次法呢?
首先,咱們要肯定,group by 的爲O_NAME,O_CLASS,O_ITEM,此時對這些值進行分層次展示,即爲下表
其中第一行爲group by出來的,接下來的三行即爲分層次彙總統計,而最後的空白的一行爲對購買者進行彙總統計。
帶入咱們的例子中,能夠看出來即爲表3-1,而第2-4行則爲多出來的部分,在此也能夠看出來rollup 對group by中的值有順序要求
1 select o_name,o_class,o_item,sum(o_price),grouping(o_name ),grouping(o_class),grouping(o_item) 2 from group_by 3 group by rollup (o_name,o_class,o_item) 4 order by o_name,o_class,o_item
使用rollup出來的結果
此時,看到的結果和表格也不同呀,其中還有這麼多空格怎麼處理??別急,接下來會講到
四、初始cube
說完rollup,開始說cube
開始說cube爲展示全部層次,這是什麼意思呢?就是有這裏面全部的分組彙總統計
在此,看下咱們的結果
select o_name,o_class,o_item,sum(o_price),grouping(o_name ),grouping(o_class),grouping(o_item) from group_by group by cube (o_name,o_class,o_item) order by o_name,o_class,o_item
五、group by、rollup、cube的用法以及區別
cube的組合
使用數字表達一下,看上去至少會更清晰點
想必這樣子看上去更明白些,空值部分即該行爲合計,這裏面列出了全部分組。
而cube與rollup的區別在於後面對2,3部分的分組
rollup分組
group by分組
想必這樣子更直觀
六、處理空值
此時有一個方法爲grouping() 能夠查看該值是否有rollup|cube產生的,若爲其值則爲1,不然爲0,使用一個case when判斷一下就好。
下圖爲使用cube時,能夠看出每一個有cube產生合計,即空值處,其grouping的值都爲1
1 select o_name,o_class,o_item,sum(o_price),grouping(o_name ),grouping(o_class),grouping(o_item) 2 from group_by 3 group by cube (o_name,o_class,o_item) 4 order by o_name,o_class,o_item
7 應用
7.1在統計時,若只有一列,那麼cube和rollup沒差異
select case when grouping(o_name) = '1' then '合計' else o_name end as customer, sum(o_price) as total, grouping(o_name) from group_by group by rollup(o_name) order by o_name
在看到上圖時,只對一列進行統計時,而且有合計值時使用cube和rollup都ok。
7.2 若進行兩列的統計
1 select case 2 when grouping(o_name) = '1' then 3 count(distinct o_name) || '位' 4 else 5 o_name 6 end as customer, 7 case 8 when grouping(o_class) = 1 and grouping(o_name) = 1 then 9 '合計' 10 when grouping(o_class) = 1 then 11 '小計' 12 else 13 o_class 14 end as class, 15 sum(o_price) as total, 16 grouping(o_name), 17 grouping(o_class) 18 from group_by 19 group by rollup(o_name, o_class) 20 order by o_name, o_class
看到相似上圖時,總的合計中不出現第二列的詳細狀況時,只對兩列進行總的合計時,使用rollup
7.3 兩列分各類狀況全統計
此時,我除了想看到兩位顧客和消費,還想看到兩位在各個類上的消費是
1 select case 2 when grouping(o_name) = '1' and grouping(o_class) = 1 then 3 count(distinct o_name) || '位消費' 4 when grouping(o_class) = 1 5 then 6 o_name 7 end as customer, 8 case 9 when grouping(o_class) = 1 and grouping(o_name) = 1 then 10 '合計' 11 when grouping(o_class) = 1 then 12 '小計' 13 else 14 o_class 15 end as class, 16 sum(o_price) as total, 17 grouping(o_name), 18 grouping(o_class) 19 from group_by 20 group by cube(o_name, o_class) 21 order by o_name, o_class desc
對應的圖就是上面這樣子。
若果仍不清楚,就挨着試一下rollup和cube。