重温SQL基本命令时,发现GROUP BY ROLLUP() 这个命令有所生疏,于是自己琢磨了下,写下来。
先通览下整个表:EMP
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
在对字段 JOB, SAL, DEPTNO 进行分组小计前,先进性分组排序,以便和小计做对比。 做这一步前,先讲下GROUP BY ROOLUP命令的基本用法:在完成了数据基本分组之后,根据分组字段列表(注释:也就是GROUP BY后面的字段,比如GROUP BY JOB , DEPTNO,那么分组字段就是JOB,DEPTNO。 以此类推,但进性分组小计时:GROUP BY ROLLUP(JOB, DEPTNO ); 那么分组字段依旧是JOB, DEPTNO ),
按照从右向左的顺序,每次去掉最后一个字段 (注释:每次去掉字段列表的最后一个字段是什么意思呢?比如:GROUP BY ROLLUP(EMPNO, ENAME,JOB, SAL,DEPTNO );
那么这次分组小计将根据字段列表的字段个数分5步进行:
1.GROUP BY EMPNO, ENAME,JOB, SAL,DEPTNO;第一次分组。
2.GROUP BY EMPNO, ENAME,JOB, SAL;第二次分组。(去掉最后一个字段DEPTNO, 后的汇总)
3.GROUP BY EMPNO, ENAME,JOB;第三次分组。(去掉最后一个字段SAL, 后的汇总)
4.GROUP BY EMPNO, ENAME;第四次分组。(去掉最后一个字段JOB, 后的汇总)
5.4.GROUP BY EMPNO;第五次分组。(去掉最后一个字段ENAME ,后的汇总)
下面先来看根据JOB(职业)分组,来计算每一类职业的平均薪水:
SQL> SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB ORDER BY JOB;
JOB AVG(SAL)
--------- ----------
ANALYST 3000
CLERK 1037.5
MANAGER 2758.33333
PRESIDENT 5000
SALESMAN 1400