標籤:
group by cube
先執行一個語句看一下:
select deptno, job, sum(sal) sal from emp
group by cube(deptno, job)
order by sal;
這個輸出結果可以看到,有deptno為空白的,有job為空白的,還有都為空白的,當然還有兩者都有的。
http://honeybinshun.iteye.com/blog/1474242
先對deptno,job進行group by 這個就是兩者都有的那些項,然後對deptno進行group by,這個就是只有deptno那些項,
然後對job進行group by,這個就是只有job的那些項,然後還會求一次不group by 的,就是兩者都為空白的那項。
2. group by rollup
先執行一下這個:
select deptno, job, sum(sal) sal from emp
group by cube(deptno, job)
order by sal;
這裡結果中有deptno,job都有的項,有只有deptno的項,還有兩者都沒有的項
執行是這樣的,先對deptno,job進行group by,這樣產生兩者都有的項,然後對deptno執行group by,這樣
產生只有deptno的項,然後還有一個是不group by 的,就是兩者都為空白的那項
其中,cube和rollup中可以有多個元素,
cube(A,B,C):(A,B,C)(A,B),(A,C),(A),(B,C),(B),(C) 這是它的group by情況 外加一次不group by
rollup(A,B,C): (A,B,C) (A,B) (A) 這是它的group by 情況,外加一次不group by的
3. grouping
這個是用來檢查一行資料是否是cube產生的NULL,什麼情況下需要這個呢?
想一下,剛才例子中,有時候是兩者都有的項,有些是只有一者的項,那麼,如果在原資料中,就是只有一者呢,
這樣就無法區別開是原資料,還是彙總後的資料了,所以用grouping來區別,是就返回1,不是就返回0
http://www.cnblogs.com/li-peng/p/3298303.html
select deptno, job, sum(sal) sal, decode(grouping(deptno), 1, ‘Y‘, ‘N‘)
from emp
group by cube(deptno, job)
order by sal;
在這個結果中,只有deptno顯示為空白的項後面是Y,其他的都是N,這是因為本身deptno原資料中就沒有是NULL的
顯示Y的是因為現在deptno是NULL,說明是彙總產生的,顯示N是因為這不是彙總產生的NULL或者這個根本不是NULL,
在這裡就是因為deptno的值不是NULL,所以後面顯示了N。
Oracle學習記錄 十 進階分組學習