oracle 中 rollup、cube、grouping 使用詳解 -- 使用oracle 樣例表演示

-- 使用oracle 的樣列庫,演示 rollup, cube, grouping 的用法與使用場景

--- ROLLUP , 爲了理解分組的成員數量,我增加了 分組的計數  COUNT(SAL)
  SELECT   E1.DEPTNO,
           JOB,
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'),
           SUM (SAL),
           COUNT (SAL)
    FROM   emp e1
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);

/*
分組情況爲:
DEPTNO,job,HIREDATE   第 1 種分組  (A,B,C) 
DEPTNO,job,           第 2 種分組  (A,B)  
DEPTNO                 第 3 種分組  (A)  
                       總分一個組
                       
-- 結果如下:  並進行部分數據解釋,以便讀者理解
    DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL)
---------- --------- ---------- ---------- ----------
        10 CLERK     1982-01-23       1300          1   (A,B,C)  -- 10號部門,CLERK工種,入職日期爲1982-01-23,只有一個成員 工資和爲:1300
        10 CLERK                      1300          1   (A,B)    -- 10號部門,CLERK工種,只有一個成員 工資和爲:1300
        10 MANAGER   1981-06-09       2450          1   (A,B,C)  -- 與第一條記錄相似的分析 
        10 MANAGER                    2450          1   (A,B)
        10 PRESIDENT 1981-11-17       5000          1   (A,B,C)  
        10 PRESIDENT                  5000          1   (A,B,C)
        10                            8750          3   (A)      -- 10號部門有3個成員,工資總計爲8750
        20 CLERK     1980-12-17        800          1
        20 CLERK                       800          1
        20 ANALYST   1981-12-03       3000          1
        20 ANALYST                    3000          1
        20 MANAGER   1981-04-02       2975          1
        20 MANAGER                    2975          1
        20                            6775          3
        30 CLERK     1981-12-03        950          1
        30 CLERK                       950          1
        30 MANAGER   1981-05-01       2850          1
        30 MANAGER                    2850          1
        30 SALESMAN  1981-02-20       1600          1
        30 SALESMAN  1981-02-22       1250          1
        30 SALESMAN  1981-09-08       1500          1
        30 SALESMAN  1981-09-28       1250          1
        30 SALESMAN                   5600          4    (A,B)    -- 30號部門,SALESMAN工種,有4個成員 工資和爲:5600 
        30                            9400          6    (A)      -- 30號部 有6個成員, 工資總計爲:9400 
                                     24925         12     ()      -- 所有部門工資總和爲:24925                        
*/


--- CUBE , 爲了理解分組的成員數量,我增加了 分組的計數  COUNT(SAL)
  SELECT   E1.DEPTNO,
           JOB,
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'),
           SUM (SAL),
           COUNT (SAL)
    FROM   emp e1
GROUP BY   CUBE (E1.DEPTNO, E1.JOB, E1.HIREDATE);

/*
分組原則:
GROUP BY CUBE(A, B, C),則首先會對(A、B、C)進行GROUP BY,然後依次是(A、B),(A、C),(A),(B、C),(B),(C),最後對全表進行GROUP BY操作。

-- 結果 :  並進行部分數據解釋,以便讀者理解
    DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL)
---------- --------- ---------- ---------- ----------
                                     24925         12   -- 全表分組,工資總合:24925 
                     1980-12-17        800          1   
                     1981-02-20       1600          1
                     1981-02-22       1250          1
                     1981-04-02       2975          1
                     1981-05-01       2850          1
                     1981-06-09       2450          1
                     1981-09-08       1500          1
                     1981-09-28       1250          1
                     1981-11-17       5000          1
                     1981-12-03       3950          2   (C)  1981-12-03 入職的有2位員工,工資總計3950
                     1982-01-23       1300          1
           CLERK                      3050          3   (B) CLERK 工種,共計有3位員工,工資總計:3050
           CLERK     1980-12-17        800          1
           CLERK     1981-12-03        950          1
           CLERK     1982-01-23       1300          1
           ANALYST                    3000          1
           ANALYST   1981-12-03       3000          1
           MANAGER                    8275          3
           MANAGER   1981-04-02       2975          1
           MANAGER   1981-05-01       2850          1
           MANAGER   1981-06-09       2450          1
           SALESMAN                   5600          4
           SALESMAN  1981-02-20       1600          1
           SALESMAN  1981-02-22       1250          1
           SALESMAN  1981-09-08       1500          1
           SALESMAN  1981-09-28       1250          1
           PRESIDENT                  5000          1
           PRESIDENT 1981-11-17       5000          1
        10                            8750          3
        10           1981-06-09       2450          1
        10           1981-11-17       5000          1
        10           1982-01-23       1300          1
        10 CLERK                      1300          1
        10 CLERK     1982-01-23       1300          1
        10 MANAGER                    2450          1
        10 MANAGER   1981-06-09       2450          1
        10 PRESIDENT                  5000          1
        10 PRESIDENT 1981-11-17       5000          1
        20                            6775          3  (A) -- 20號部 有3個成員, 工資總計爲:6775 
        20           1980-12-17        800          1
        20           1981-04-02       2975          1
        20           1981-12-03       3000          1
        20 CLERK                       800          1
        20 CLERK     1980-12-17        800          1
        20 ANALYST                    3000          1
        20 ANALYST   1981-12-03       3000          1
        20 MANAGER                    2975          1
        20 MANAGER   1981-04-02       2975          1
        30                            9400          6  (A) -- 30號部 有6個成員, 工資總計爲:9400 
        30           1981-02-20       1600          1
        30           1981-02-22       1250          1
        30           1981-05-01       2850          1
        30           1981-09-08       1500          1
        30           1981-09-28       1250          1
        30           1981-12-03        950          1
        30 CLERK                       950          1
        30 CLERK     1981-12-03        950          1
        30 MANAGER                    2850          1
        30 MANAGER   1981-05-01       2850          1
        30 SALESMAN                   5600          4  (A、B) 30號部門,  SALESMAN 工種,有4 個成員,工資總計:5600
        30 SALESMAN  1981-02-20       1600          1  
        30 SALESMAN  1981-02-22       1250          1
        30 SALESMAN  1981-09-08       1500          1  (A、B、C)  0號部門,  SALESMAN 工種,1981-09-08入職,1 個員工,工資總計:1500
        30 SALESMAN  1981-09-28       1250          1  (A、B、C)  0號部門,  SALESMAN 工種,1981-09-28入職,1 個員工,工資總計:1250

已選擇65行。
*/

--- GROUPING函數
/*
GROUPING 是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值爲1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值爲0。
僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯繫的選擇列表中才允許分組。

語法:  GROUPING ( column_name )

是 GROUP BY 子句中用於檢查 CUBE 或 ROLLUP 空值的列。

返回類型: int

分組用於區分由 CUBE 和 ROLLUP 返回的空值和標準的空值。作爲CUBE 或 ROLLUP 操作結果返回的 NULL 是 NULL 的特殊應用。它在結果集內作爲列的佔位符,意思是"全體"。
*/

-- grouping 樣列
  SELECT   E1.DEPTNO,
           JOB,
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD') HIREDATE,
           SUM (SAL),
           COUNT (SAL),
           GROUPING (E1.DEPTNO) d,
           GROUPING (JOB) j,
           GROUPING (E1.HIREDATE) h
    FROM   emp e1
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);



/*
-- 結果 :  並進行部分數據解釋,以便讀者理解

    DEPTNO JOB       HIREDATE     SUM(SAL) COUNT(SAL)   D   J   H
---------- --------- ---------- ---------- ---------- --- --- ---
        10 CLERK     1982-01-23       1300          1   0   0   0   所有列都有數據作爲分組,所以全爲 0
        10 CLERK                      1300          1   0   0   1   DEPTNO JOB列 有數據,而HIREDATE沒有數據,所以 H 列產生的值爲:1
        10 MANAGER   1981-06-09       2450          1   0   0   0    
        10 MANAGER                    2450          1   0   0   1
        10 PRESIDENT 1981-11-17       5000          1   0   0   0
        10 PRESIDENT                  5000          1   0   0   1
        10                            8750          3   0   1   1
        20 CLERK     1980-12-17        800          1   0   0   0
        20 CLERK                       800          1   0   0   1
        20 ANALYST   1981-12-03       3000          1   0   0   0
        20 ANALYST                    3000          1   0   0   1
        20 MANAGER   1981-04-02       2975          1   0   0   0
        20 MANAGER                    2975          1   0   0   1
        20                            6775          3   0   1   1
        30 CLERK     1981-12-03        950          1   0   0   0
        30 CLERK                       950          1   0   0   1
        30 MANAGER   1981-05-01       2850          1   0   0   0
        30 MANAGER                    2850          1   0   0   1
        30 SALESMAN  1981-02-20       1600          1   0   0   0
        30 SALESMAN  1981-02-22       1250          1   0   0   0
        30 SALESMAN  1981-09-08       1500          1   0   0   0
        30 SALESMAN  1981-09-28       1250          1   0   0   0
        30 SALESMAN                   5600          4   0   0   1
        30                            9400          6   0   1   1
                                     24925         12   1   1   1   
*/


-- 應用 grouping  
SELECT   CASE
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 0)
                   THEN DEPTNO|| ' '|| JOB|| ' ' || TO_CHAR (HIREDATE, 'YYYY-MM-DD')|| ' subtotal:'
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 1)
                   THEN DEPTNO || ' ' || JOB || ' subtotal:'
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1)
                   THEN DEPTNO || ' subtotal:'
              WHEN (    GROUPING (E1.DEPTNO) = 1 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1)
                   THEN 'Total:'
           END
              "Total", 
           SUM (SAL), COUNT (SAL)
    FROM   emp e1
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE);

-- 結果如下:
/*
Total                                  SUM(SAL) COUNT(SAL)
------------------------------------ ---------- ----------
10 CLERK 1982-01-23 subtotal:              1300          1   (A,B,C) 分組
10 CLERK subtotal:                         1300          1   (A,B) 分組
10 MANAGER 1981-06-09 subtotal:            2450          1
10 MANAGER subtotal:                       2450          1
10 PRESIDENT 1981-11-17 subtotal:          5000          1
10 PRESIDENT subtotal:                     5000          1
10 subtotal:                               8750          3  (A) 分組 10號部門,共3個成員,工資總計:8750
20 CLERK 1980-12-17 subtotal:               800          1
20 CLERK subtotal:                          800          1
20 ANALYST 1981-12-03 subtotal:            3000          1
20 ANALYST subtotal:                       3000          1
20 MANAGER 1981-04-02 subtotal:            2975          1
20 MANAGER subtotal:                       2975          1
20 subtotal:                               6775          3
30 CLERK 1981-12-03 subtotal:               950          1
30 CLERK subtotal:                          950          1
30 MANAGER 1981-05-01 subtotal:            2850          1
30 MANAGER subtotal:                       2850          1
30 SALESMAN 1981-02-20 subtotal:           1600          1
30 SALESMAN 1981-02-22 subtotal:           1250          1
30 SALESMAN 1981-09-08 subtotal:           1500          1
30 SALESMAN 1981-09-28 subtotal:           1250          1
30 SALESMAN subtotal:                      5600          4
30 subtotal:                               9400          6
Total:                                    24925         12  () 全部總計:12 個成員,工資總計爲:24925

已選擇25行。
*/


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章