oracle GROUP BY rollup

1.ROW_NUMBER() OVER函數的基本用法用法
http://www.cnblogs.com/fxgachiever/archive/2010/09/15/1826792.html
2.DeCode函數:
http://www.cnblogs.com/juddhu/archive/2012/03/07/2383101.html
3.GROUP BY ROLLUP
http://hi.baidu.com/420350501/item/a01fdf3ed3a5bb82f4e4ad44
http://www.cnblogs.com/simplefrog/archive/2012/07/15/2592371.html

rollup:爲每一個分組返回一個小計,同時爲全部分組返回總計;

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

相關文章
相關標籤/搜索