重温SQL基本命令时,发现GROUP BY ROLLUP() 这个命令有所生疏,于是自己琢磨了下,写下来。
先通览下整个表:EMP
SQL> SELECT * FROM EMP ;
--查询结果:
按照从右向左的顺序,每次去掉最后一个字段 <也就是每次去掉字段列表最右边的字段>(注释:每次去掉字段列表的最后一个字段是什么意思呢?比如: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(职业)分组,来计算每一类职业的平均薪水:
我们根据一栏:MANAGER(经理)的平均薪水为2758.3333来对比下面:
分析如下,但开始根据GROUP BY ROLLUP(JOB,DEPTNO);进性分组小计时,JOB出现重复的,但DEPTNO却分散在不同的部门;所以结果@_1如下:
但去掉字段列表最后一个字段时<即字段列表最右边的那个字段,本次为:DEPTNO>,其实执行的就变成GROUP BY ROLLUP(JOB);--所以结果@_2如下:
MANAGER 2758.33333 --但去掉了DEPTNO字段后,这一列当然就为NULL,不同的查询下,有时显示的是空。
然后根据ORDER BY JOB,排序后,所以结@_1,@_2就如下:
先通览下整个表: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
按照从右向左的顺序,每次去掉最后一个字段 <也就是每次去掉字段列表最右边的字段>(注释:每次去掉字段列表的最后一个字段是什么意思呢?比如: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
我们根据一栏:MANAGER(经理)的平均薪水为2758.3333来对比下面:
- SQL> SELECT JOB, DEPTNO, AVG(SAL) FROM EMP GROUP BY ROLLUP(JOB,DEPTNO) ORDER BY JOB;
- JOB DEPTNO AVG(SAL)
- --------- ------ ----------
- ANALYST 20 3000
- ANALYST 3000
- CLERK 10 1300
- CLERK 20 950
- CLERK 30 950
- CLERK 1037.5
- MANAGER 10 2450
- MANAGER 20 2975
- MANAGER 30 2850
- MANAGER 2758.33333
- PRESIDENT 10 5000
- PRESIDENT 5000
- SALESMAN 30 1400
- SALESMAN 1400
分析如下,但开始根据GROUP BY ROLLUP(JOB,DEPTNO);进性分组小计时,JOB出现重复的,但DEPTNO却分散在不同的部门;所以结果@_1如下:
- <pre name="code" class="sql">MANAGER 10 2450
- MANAGER 20 2975
- MANAGER 30 2850
- MANAGER 2758.33333
但去掉字段列表最后一个字段时<即字段列表最右边的那个字段,本次为:DEPTNO>,其实执行的就变成GROUP BY ROLLUP(JOB);--所以结果@_2如下:
MANAGER 2758.33333 --但去掉了DEPTNO字段后,这一列当然就为NULL,不同的查询下,有时显示的是空。
然后根据ORDER BY JOB,排序后,所以结@_1,@_2就如下:
- MANAGER 10 2450
- MANAGER 20 2975
- MANAGER 30 2850
- MANAGER 2758.33333