ORACLE命令 ROLLUP

重温SQL基本命令时,发现GROUP BY ROLLUP() 这个命令有所生疏,于是自己琢磨了下,写下来。
先通览下整个表:EMP
SQL> SELECT * FROM EMP ;


--查询结果:

[sql]  view plain copy
  1. EMPNO ENAME      JOB         MGR HIREDATE          SAL DEPTNO  
  2. ----- ---------- --------- ----- ----------- --------- ------  
  3.  7369 SMITH      CLERK      7902 1980/12/17     800.00     20  
  4.  7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00     30  
  5.  7521 WARD       SALESMAN   7698 1981/2/22     1250.00     30  
  6.  7566 JONES      MANAGER    7839 1981/4/2      2975.00     20  
  7.  7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00     30  
  8.  7698 BLAKE      MANAGER    7839 1981/5/1      2850.00     30  
  9.  7782 CLARK      MANAGER    7839 1981/6/9      2450.00     10  
  10.  7788 SCOTT      ANALYST    7566 1987/4/19     3000.00     20  
  11.  7839 KING       PRESIDENT       1981/11/17    5000.00     10  
  12.  7844 TURNER     SALESMAN   7698 1981/9/8      1500.00     30  
  13.  7876 ADAMS      CLERK      7788 1987/5/23     1100.00     20  
  14.  7900 JAMES      CLERK      7698 1981/12/3      950.00     30  
  15.  7902 FORD       ANALYST    7566 1981/12/3     3000.00     20  
  16.  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]  view plain copy
  1. SQL>  SELECT JOB,  AVG(SAL) FROM EMP GROUP BY JOB ORDER BY JOB;  
  2.    
  3. JOB         AVG(SAL)  
  4. --------- ----------  
  5. ANALYST         3000  
  6. CLERK         1037.5  
  7. MANAGER   2758.33333  
  8. PRESIDENT       5000  
  9. SALESMAN        1400  


我们根据一栏:MANAGER(经理)的平均薪水为2758.3333来对比下面:
[sql]  view plain copy
  1. SQL> SELECT JOB, DEPTNO, AVG(SAL) FROM EMP GROUP BY ROLLUP(JOB,DEPTNO) ORDER BY JOB;  
  2.    
  3. JOB       DEPTNO   AVG(SAL)  
  4. --------- ------ ----------  
  5. ANALYST       20       3000  
  6. ANALYST                3000  
  7. CLERK         10       1300  
  8. CLERK         20        950  
  9. CLERK         30        950  
  10. CLERK                1037.5  
  11. MANAGER       10       2450  
  12. MANAGER       20       2975  
  13. MANAGER       30       2850  
  14. MANAGER          2758.33333  
  15. PRESIDENT     10       5000  
  16. PRESIDENT              5000  
  17. SALESMAN      30       1400  
  18. SALESMAN               1400  


                
分析如下,但开始根据GROUP BY ROLLUP(JOB,DEPTNO);进性分组小计时,JOB出现重复的,但DEPTNO却分散在不同的部门;所以结果@_1如下:
[sql]  view plain copy
  1. <pre name="code" class="sql">MANAGER       10       2450  
  2. MANAGER       20       2975  
  3. MANAGER       30       2850  
  4. MANAGER          2758.33333  


 


但去掉字段列表最后一个字段时<即字段列表最右边的那个字段,本次为:DEPTNO>,其实执行的就变成GROUP BY ROLLUP(JOB);--所以结果@_2如下:
MANAGER          2758.33333   --但去掉了DEPTNO字段后,这一列当然就为NULL,不同的查询下,有时显示的是空。


然后根据ORDER BY JOB,排序后,所以结@_1,@_2就如下:
[sql]  view plain copy
  1. MANAGER       10       2450  
  2. MANAGER       20       2975  
  3. MANAGER       30       2850  
  4. MANAGER          2758.33333  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值