基本命令:GROUP BY CUBE(欄位列表);
CUBE命令根據欄位列表,產生不同的排列組合,並根據每一種組合結果,產生統計匯總。
比如:GROUP BY CUBE( city, job, age );排列組合的結果如示:
1)city,job,age
2)city, job
3)city
4)job, age
5)age
6)city , age
7) job
所以就有7種排列組合。
2)根據每一種排列組合,產生不同的統計匯總,如下:
1) group by cube(city, job ,age );
2) group by cube(city, job);
3) group by cube(city);
4)group by cube(job, age );
5)group by cube(age);
6)group by cube(city, age);
7)group by cube(job);
舉例說明:
1)先統觀我們要用到的表(TABLE ):
SQL> SELECT * FROM EMP ; EMPNO ENAME JOB MGR HIREDATE SAL DEPTNO---------- ---------- --------- ----- ----------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 30 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10
2) 根據職業(JOB)求不同職業的平均薪水(SAL):
SQL> SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB ORDER BY JOB ASC ; JOB AVG(SAL)--------- ----------ANALYST 3000CLERK 1037.5MANAGER 2758.33333PRESIDENT 5000SALESMAN 1400
3)根據不同部門(DEPTNO),不同職業(JOB),求平均薪水(SAL):
SQL> SELECT JOB, DEPTNO , AVG(SAL) FROM EMP GROUP BY JOB , DEPTNO ORDER BY JOB; JOB DEPTNO AVG(SAL)--------- ------ ----------ANALYST 20 3000CLERK 10 1300CLERK 20 950CLERK 30 950MANAGER 10 2450MANAGER 20 2975MANAGER 30 2850PRESIDENT 10 5000SALESMAN 30 1400
-- 可以看到不同部門(DEPTNO:10,20,30)的平均年薪水AVG(SAL)是不一樣的。
4)統計匯總:
SQL> SELECT JOB, DEPTNO, AVG(SAL) FROM EMP GROUP BY CUBE(JOB, DEPTNO) ORDER BY JOB DESC ; JOB DEPTNO AVG(SAL)--------- ------ ---------- 10 2916.66666 20 2175 30 1566.66666 2073.21428SALESMAN 30 1400SALESMAN 1400PRESIDENT 10 5000PRESIDENT 5000MANAGER 10 2450MANAGER 20 2975MANAGER 30 2850MANAGER 2758.33333CLERK 10 1300CLERK 20 950CLERK 30 950CLERK 1037.5ANALYST 20 3000ANALYST 3000
---18 rows selected 。。///共有18行結果
我們來看看:group by cube(JOB,DEPTNO) order by JOB desc ; 根據JOB ,DEPTNO進性統計匯總,排列組合如下:
1)JOB,DEPTNO
2) JOB
3)DEPTNO
4)去掉JOB和DEPTNO
統計匯總如下:
1)根據JOB,DEPTNO 統計匯總,結果如下:
SALESMAN 30 1400PRESIDENT 10 5000MANAGER 10 2450MANAGER 20 2975MANAGER 30 2850CLERK 10 1300CLERK 20 950CLERK 30 950ANALYST 20 3000
--9 rows selected。。//9行結果。
2)根據JOB統計匯總,結果如下:
SALESMAN 1400PRESIDENT 5000MANAGER 2758.33333CLERK 1037.5ANALYST 3000
。。//共5行被選取。
3)根據DEPTNO統計匯總結果如下:
10 2916.66666 20 2175 30 1566.66666
。。//共3行被選取。
4)剩下最後一行:
2073.21428
。。//剩下最後1行,
為了驗證這個結果是否準確,測試下:
SQL> SELECT AVG(SAL) FROM EMP; AVG(SAL)----------2073.21428
--//累計9+5+3+1=18與 SELECT JOB, DEPTNO, AVG(SAL) FROM EMP GROUP BY CUBE(JOB, DEPTNO) ORDER BY JOB DESC ;查詢結果相同
GROUP BY CUBE( );通過舉例說明,應該還是很容易理解的。