SQL> select emp_id,month,prd_type_id,amount
2 from all_sales
3 where emp_id=21
4 order by emp_id,month ;html
EMP_ID MONTH PRD_TYPE_ID AMOUNT
---------- ---------- ----------- ----------
21 1 4 3034.84
21 1 3 6034.84
21 1 2 1034.84
21 1 5
21 1 1 10034.84
21 2 3 1944.65
21 2 4 2944.65
21 2 1 15144.65
注:表中數據太多,只顯示了一部分。
表all_sales存放2003年每一個員工每一個產品每一個月的銷量,
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by emp_id,month
5 order by month ;函數
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
用ROLLUP 進行分組spa
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by rollup(emp_id,month) ;htm
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
466997.84blog
ROLLUP(emp_id,month):先對每一個EMP_id的每一個月的銷量
進行分組求和,至關於GROUP BY EMP_ID,MONTH,得出這個員工,
每一個月的銷量總和,而後求這個員工一年全部的銷量,至關於
GROUP BY EMP_ID,最後所求全部員工的銷量總和,
由於查詢限制只返回EMP_ID=21的數據,因此
最後兩條記錄的值相同。
group by rollup(emp_id,month) 與group by emp_id,month
不一樣之處在因而,group by rollup(emp_id,month) 求得每一個員工的
月銷量以後,又多作了兩個工做,一是求得每一個員一年全部的銷量,
二是求全部員工的年總銷量。
若是除去where emp_id=21,則最後一條記錄返回全部員工的總銷量,如:
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 group by rollup(emp_id,month) ;get
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
22 1 21939.36
22 2 21078.6
23 6 15658.56
23 7 33649.3
23 11 30518.92
23 12 24139.36
23 323077.84
24 1 14669.36
24 2 28878.6
24 3 35651.32
24 10 30116.76
24 11 22621.92
24 12 24139.36
24 333370.84
25 1 7269.36
25 2 13678.6
25 11 12821.92
25 12 12639.36
25 187970.84
26 1 16568.75
26 11 14821.38
26 12 15639.37
26 228769.93
1972485.13
數據太多,只顯示一部分。
能夠看出,group by rollup(emp_id,month) 爲每一個員工的銷量進行了
彙總,得出了月銷量和年銷量(每一個員工的最後一條),同時爲全部員工進行了彙總,得出全部
員工的年總銷量(最後一條記錄)產品
函數:grouping
接收列做爲參數,若是列爲空,則grouping返回1,不然返回0,該函數與rollup搭配使用。
能夠使用grouping函數對上述查詢進行處理。
SQL> SELECT DECODE(GROUPING(EMP_ID), 1, '全部員工', EMP_ID) EMP_ID,
2 nvl2(emp_id,DECODE(GROUPING(MONTH), 1, '員工年度', MONTH),'全部員工年度') ND,
3 SUM(AMOUNT)
4 FROM ALL_SALES
5 GROUP BY ROLLUP(EMP_ID, MONTH)
6 ;
EMP_ID ND SUM(AMOUNT)
---------------------------------------- ---------------------------------------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 12 36139.36
21 員工年度 466997.84
26 7 12549.36
26 8 23139.28
26 9 19318.28
26 10 26116.99
26 11 14821.38
26 12 15639.37
26 員工年度 228769.93
全部員工 全部員工年度 1972485.13it