-- 使用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行。
*/
oracle 中 rollup、cube、grouping 使用詳解 -- 使用oracle 樣例表演示
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.