rollup是對group by的擴充,會進行小計和合計,而cube包含rollup,是粒度更精細的小計和合計。當只有一個欄位時,rollup和cube是一樣的。
可用grouping對rollup和cube進行測試:0看;1不看[看錶示列有顯示,不看錶示沒有顯示]
① rollup
㈠ 什麼都不看
㈡ 從左往右 ┌ 先看第1個
│ 再看前2個
└ 後看前3個
② cube:0、1全排列
rollup
rollup後面指定的列以逗號分隔,rollup的計算結果和其後面指定的列的順序有關,因為rollup的分組具有方向性。若指定n列,則有n+1種分組方式。可改變列的順序,達到不同的業務需求。一定要牢記列的順序對結果的影響!
例子:
[sql]
view plaincopyprint?
- 20:32:51 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)
- 20:33:06 2 from dept a,emp b
- 20:33:06 3 where a.deptno=b.deptno
- 20:33:06 4 group by
rollup(a.dname,b.job)
- 20:33:08 5 /
-
- DNAME JOB SUM_SAL GROUPING(A.DNAME)
GROUPING(B.JOB)
- ---------- ---------- ---------- ----------------- ---------------
- SALES CLERK 950 0 0
- SALES MANAGER 2850 0 0
- SALES SALESMAN 5600 0 0
- SALES 9400 0 1
- RESEARCH CLERK 1200 0 0
- RESEARCH ANALYST 7000 0 0
- RESEARCH MANAGER 2975 0 0
- RESEARCH 11175 0 1
- ACCOUNTING CLERK 1300 0 0
- ACCOUNTING MANAGER 2450 0 0
- ACCOUNTING PRESIDENT 5000 0 0
- ACCOUNTING 8750 0 1
- 29325 1 1
-
- 已選擇13行。
20:32:51 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)20:33:06 2 from dept a,emp b20:33:06 3 where a.deptno=b.deptno20:33:06 4 group by rollup(a.dname,b.job)20:33:08 5 /DNAME JOB SUM_SAL GROUPING(A.DNAME) GROUPING(B.JOB)---------- ---------- ---------- ----------------- ---------------SALES CLERK 950 0 0SALES MANAGER 2850 0 0SALES SALESMAN 5600 0 0SALES 9400 0 1RESEARCH CLERK 1200 0 0RESEARCH ANALYST 7000 0 0RESEARCH MANAGER 2975 0 0RESEARCH 11175 0 1ACCOUNTING CLERK 1300 0 0ACCOUNTING MANAGER 2450 0 0ACCOUNTING PRESIDENT 5000 0 0ACCOUNTING 8750 0 1 29325 1 1已選擇13行。
解釋:什麼都不看(1,1);從左往右,先看第一個(0,1)
可以將不需要進行小計和合計的列移出rollup,要小計的留在rollup裡面。
比如:
[sql]
view plaincopyprint?
- 20:48:37 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)
- 20:57:43 2 from dept a,emp b
- 20:57:43 3 where a.deptno=b.deptno
- 20:57:43 4 group by a.dname,rollup(b.job)
- 20:57:45 5 /
-
- DNAME JOB SUM_SAL
GROUPING(A.DNAME) GROUPING(B.JOB)
- ---------------------------- ------------------ ---------- ----------------- ---------------
- SALES CLERK 950 0 0
- SALES MANAGER 2850 0 0
- SALES SALESMAN 5600 0 0
- SALES 9400 0 1
- RESEARCH CLERK 1200 0 0
- RESEARCH ANALYST 7000 0 0
- RESEARCH MANAGER 2975 0 0
- RESEARCH 11175 0 1
- ACCOUNTING CLERK 1300 0 0
- ACCOUNTING MANAGER 2450 0 0
- ACCOUNTING PRESIDENT 5000 0 0
- ACCOUNTING 8750 0 1
-
- 已選擇12行。
20:48:37 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)20:57:43 2 from dept a,emp b20:57:43 3 where a.deptno=b.deptno20:57:43 4 group by a.dname,rollup(b.job)20:57:45 5 /DNAME JOB SUM_SAL GROUPING(A.DNAME) GROUPING(B.JOB)---------------------------- ------------------ ---------- ----------------- ---------------SALES CLERK 950 0 0SALES MANAGER 2850 0 0SALES SALESMAN 5600 0 0SALES 9400 0 1RESEARCH CLERK 1200 0 0RESEARCH ANALYST 7000 0 0RESEARCH MANAGER 2975 0 0RESEARCH 11175 0 1ACCOUNTING CLERK 1300 0 0ACCOUNTING MANAGER 2450 0 0ACCOUNTING PRESIDENT 5000 0 0ACCOUNTING 8750 0 1已選擇12行。
cube
和rollup不同,cube的計算結果和順序無關。若n列,則分組方式有2的n次方種。
[sql]
view plaincopyprint?
- 20:57:46 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)
- 21:27:03 2 from dept a,emp b
- 21:27:03 3 where a.deptno=b.deptno
- 21:27:03 4 group by
cube(a.dname,b.job)
- 21:27:04 5 /
-
- DNAME JOB SUM_SAL
GROUPING(A.DNAME) GROUPING(B.JOB)
- ---------------------------- ------------------ ---------- ----------------- ---------------
- 29325 1 1
- CLERK 3450 1 0
- ANALYST 7000 1 0
- MANAGER 8275 1 0
- SALESMAN 5600 1 0
- PRESIDENT 5000 1 0
- SALES 9400 0 1
- SALES CLERK 950 0 0
- SALES MANAGER 2850 0 0
- SALES SALESMAN 5600 0 0
- RESEARCH 11175 0 1
- RESEARCH CLERK 1200 0 0
- RESEARCH ANALYST 7000 0 0
- RESEARCH MANAGER 2975 0 0
- ACCOUNTING 8750 0 1
- ACCOUNTING CLERK 1300 0 0
- ACCOUNTING MANAGER 2450 0 0
- ACCOUNTING PRESIDENT 5000 0 0
-
- 已選擇18行。
20:57:46 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)21:27:03 2 from dept a,emp b21:27:03 3 where a.deptno=b.deptno21:27:03 4 group by cube(a.dname,b.job)21:27:04 5 /DNAME JOB SUM_SAL GROUPING(A.DNAME) GROUPING(B.JOB)---------------------------- ------------------ ---------- ----------------- --------------- 29325 1 1 CLERK 3450 1 0 ANALYST 7000 1 0 MANAGER 8275 1 0 SALESMAN 5600 1 0 PRESIDENT 5000 1 0SALES 9400 0 1SALES CLERK 950 0 0SALES MANAGER 2850 0 0SALES SALESMAN 5600 0 0RESEARCH 11175 0 1RESEARCH CLERK 1200 0 0RESEARCH ANALYST 7000 0 0RESEARCH MANAGER 2975 0 0ACCOUNTING 8750 0 1ACCOUNTING CLERK 1300 0 0ACCOUNTING MANAGER 2450 0 0ACCOUNTING PRESIDENT 5000 0 0已選擇18行。
注釋:和rollup的結果相比,cube的所有可能的分組都走一遍。
可以去掉合計和某些不需要的小計,通過部分cube實現。部分cube比部分rollup來得有用多了。
[sql]
view plaincopyprint?
- 21:27:06 scott@ORCL (^ω^) select a.dname,b.job,sum(b.sal) sum_sal,grouping(a.dname),grouping(b.job)
- 21:32:20 2 from dept a,emp b
- 21:32:20 3 where a.deptno=b.deptno
- 21:32:20 4 group by a.dname,cube(b.job)
- 21:32:21 5 /
-
- DNAME JOB SUM_SAL
GROUPING(A.DNAME) GROUPING(B.JOB)
- ---------------------------- ------------------ ---------- ----------------- ---------------
- SALES 9400 0 1
- SALES CLERK 950 0 0
- SALES MANAGER 2850 0 0
- SALES SALESMAN 5600 0 0
- RESEARCH 11175 0 1
- RESEARCH CLERK 1200 0 0
- RESEARCH ANALYST 7000 0 0
- RESEARCH MANAGER 2975 0 0
- ACCOUNTING 8750 0 1
- ACCOUNTING CLERK 1300 0 0
- ACCOUNTING MANAGER 2450 0 0
- ACCOUNTING PRESIDENT 5000 0 0
-
- 已選擇12行。
原文地址:http://blog.csdn.net/linwaterbin/article/details/7985717