设为首页 收藏本站
查看: 1479|回复: 0

[经验分享] oracle中group by的扩展

[复制链接]

尚未签到

发表于 2016-8-3 12:40:46 | 显示全部楼层 |阅读模式
  
  
  扩展了的group by子句.我们都知道,group by子句用于将查询结果分组。下面是未扩展的group by子句SQL> select job,sum(sal)2  from emp3  group by job;JOB         SUM(SAL)--------- ----------ANALYST         6000CLERK           4150MANAGER         8275PRESIDENT       5000SALESMAN        5600--扩展了的group by子句。1.rollup子句作用:为每一个分组返回一条小计录,并为全部分组返回总计。可以向rollup中传递一列或者多列,rollup可以结合聚合函数一起使用。实例1:select job,empno,sum(sal)from empgroup by rollup(job,empno);--JOB       EMPNO   SUM(SAL)--------- ----- ----------CLERK      7900        950CLERK      7369        800CLERK      7876       1100CLERK      7934       1300CLERK                 4150ANALYST    7788       3000ANALYST    7902       3000ANALYST               6000MANAGER    7566       2975MANAGER    7698       2850MANAGER    7782       2450MANAGER               8275SALESMAN   7499       1600SALESMAN   7521       1250SALESMAN   7654       1250SALESMAN   7844       1500SALESMAN              5600PRESIDENT  7839       5000PRESIDENT             500029025实例2:select job,empno,avg(sal)from empgroup by rollup(job,empno);--JOB       EMPNO   AVG(SAL)--------- ----- ----------CLERK      7900        950CLERK      7369        800CLERK      7876       1100CLERK      7934       1300CLERK               1037.5ANALYST    7788       3000ANALYST    7902       3000ANALYST               3000MANAGER    7566       2975MANAGER    7698       2850MANAGER    7782       2450MANAGER         2758.33333SALESMAN   7499       1600SALESMAN   7521       1250SALESMAN   7654       1250SALESMAN   7844       1500SALESMAN              1400PRESIDENT  7839       5000PRESIDENT             50002073.214282.cube子句作用:返回cube中所有列组合的小计信息,同时在最后显示总计信息。实例1:select job,sum(sal)from empgroup by cube(job);--JOB         SUM(SAL)--------- ----------29025CLERK           4150ANALYST         6000MANAGER         8275SALESMAN        5600PRESIDENT       5000实例2:select empno,job,avg(sal)from empgroup by cube(empno,job);--EMPNO JOB         AVG(SAL)----- --------- ----------2073.21428CLERK         1037.5ANALYST         3000MANAGER   2758.33333SALESMAN        1400PRESIDENT       50007900                  9507900 CLERK            9507369                  8007369 CLERK            8007499                 16007499 SALESMAN        16007521                 12507521 SALESMAN        12507566                 29757566 MANAGER         29757654                 12507654 SALESMAN        12507698                 28507698 MANAGER         28507782                 24507782 MANAGER         24507788                 30007788 ANALYST         30007839                 50007839 PRESIDENT       50007844                 15007844 SALESMAN        15007876                 11007876 CLERK           11007902                 30007902 ANALYST         30007934                 13007934 CLERK           13003.grouping sets子句作用:按分组列,分别只返回分组列小计记录实例:select empno,job,avg(sal)from empgroup by grouping sets(empno,job);--EMPNO JOB         AVG(SAL)----- --------- ----------7369                  8007499                 16007521                 12507566                 29757654                 12507698                 28507782                 24507788                 30007839                 50007844                 15007876                 11007900                  9507902                 30007934                 1300ANALYST         3000CLERK         1037.5MANAGER   2758.33333PRESIDENT       5000SALESMAN        1400--扩展group by子句的综合应用rollup子句和cube子句还可以结合其他oracle内置函数一起使用,得到你所想要的结果。grouping()函数:接受一列,若此列为空,返回1,若此列非空,返回0.实例1:在rollup中对单列使用grouping()select grouping(job),job,sum(sal)from empgroup by rollup(job);--GROUPING(JOB) JOB         SUM(SAL)------------- --------- ----------0 ANALYST         60000 CLERK           41500 MANAGER         82750 PRESIDENT       50000 SALESMAN        56001                29025--实例2:使用decode()转换grouping()的返回值select decode(grouping(job),1,'总计',job) divisions,sum(sal)from empgroup by rollup(job);DIVISIONS   SUM(SAL)--------- ----------ANALYST         6000CLERK           4150MANAGER         8275PRESIDENT       5000SALESMAN        5600总计           29025--实例3:使用decode()和grouping()转换多列select decode(grouping(job),1,'总计',job) job,decode(grouping(empno),1,'小计',empno) empno,avg(sal)from empgroup by rollup(job,empno);--JOB       EMPNO                                      AVG(SAL)--------- ---------------------------------------- ----------CLERK     7900                                            950CLERK     7369                                            800CLERK     7876                                           1100CLERK     7934                                           1300CLERK     小计                                         1037.5ANALYST   7788                                           3000ANALYST   7902                                           3000ANALYST   小计                                           3000MANAGER   7566                                           2975MANAGER   7698                                           2850MANAGER   7782                                           2450MANAGER   小计                                     2758.33333SALESMAN  7499                                           1600SALESMAN  7521                                           1250SALESMAN  7654                                           1250SALESMAN  7844                                           1500SALESMAN  小计                                           1400PRESIDENT 7839                                           5000PRESIDENT 小计                                           5000总计      小计                                     2073.21428--实例4:cube与grouping()结合使用select decode(grouping(job),1,'总计',job) sum,decode(grouping(empno),1,'小计',empno) empno,sum(sal)from empgroup by cube(job,empno);--SUM       EMPNO                                      SUM(SAL)--------- ---------------------------------------- ----------总计      小计                                          29025总计      7900                                            950总计      7369                                            800总计      7499                                           1600总计      7521                                           1250总计      7566                                           2975总计      7654                                           1250总计      7698                                           2850总计      7782                                           2450总计      7788                                           3000总计      7839                                           5000总计      7844                                           1500总计      7876                                           1100总计      7902                                           3000总计      7934                                           1300CLERK     小计                                           4150CLERK     7900                                            950CLERK     7369                                            800CLERK     7876                                           1100CLERK     7934                                           1300ANALYST   小计                                           6000ANALYST   7788                                           3000ANALYST   7902                                           3000MANAGER   小计                                           8275MANAGER   7566                                           2975MANAGER   7698                                           2850MANAGER   7782                                           2450SALESMAN  小计                                           5600SALESMAN  7499                                           1600SALESMAN  7521                                           1250SALESMAN  7654                                           1250SALESMAN  7844                                           1500PRESIDENT 小计                                           5000PRESIDENT 7839                                           5000--

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252335-1-1.html 上篇帖子: [转]Oracle开发专题之:行列转换 下篇帖子: Oracle单行函数和多行函数实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表