zoukankan      html  css  js  c++  java
  • Oracle中group by 的扩展函数rollup、cube、grouping sets

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup、cube、grouping sets。分别介绍例如以下:

    1、rollup

    对数据库表emp。如果当中两个字段名为a,b,c。

    假设使用group by rollup(a,b),首先会对(a,b)进行group by ,然后对 a 进行 group by 。最后对全表进行 group by 操作。

    例如以下查询结果:

    查询语句

    Select deptno,job,sum(sal) from emp group by rollup(deptno,job);

    等同于

    Select deptno,job,sum(sal) from emp group by deptno,job

    union all

    Select deptno,null sum(sal) from emp group by deptno

    union all

    Select null,null,sum(sal) from emp (group by null )

    2、cube

    假设使用group by cube(a,b),,则首先会对(a,b)进行group by,然后依次是(a),(b),最后对全表进行group by 操作,一共是2^2=4次grouping

    例如以下查询结果。

    查询语句

    Select deptno,job,sum(sal) from emp group by cube(deptno,job);

    等同于

    Select deptno,job,sum(sal) from emp group by deptno,job

    union all

    Select deptno,null sum(sal) from emp group by deptno

    union all

    Select null,job, sum(sal) from emp group by job

    union all

    Select null,null,sum(sal) from emp (group by null )

    3、grouping sets

    grouping sets就是对參数中的每一个參数做grouping。假设使用group by grouping sets(a,b)。则对(a),(b)进行group by

    例如以下查询结果:

     

    查询语句

    Select deptno,job,sum(sal) from emp group by cube(deptno,job);

    等同于

    select null,job,sum(sal) from emp group by job

    union all

    select deptno,null,sum(sal) from emp group by deptno

    4、grouping

    使用grouping能够推断该行是数据库中本来的行,还是有统计产生的行。grouping值为0时说明这个值是数据库中本来的值。为1说明是统计的结果,參数仅仅有一个,并且必须为group by中出现的某一列

    例如以下查询结果:

    查询语句

    select deptno,job,sum(sal),grouping(deptno) a,grouping(job) b from emp group by rollup(deptno,job);

    5、grouping_id

    Grouping_id()的返回值事实上就是參数中的每列的grouping()值的二进制向量。假设grouping(a)=1,grouping(b)=1,则grouping_id(A,B)的返回值就是二进制的11。转成10进制就是3。

    參数能够是多个,但必须为group by中出现的列。

    查询结果例如以下:

    查询语句

    select deptno,job,sum(sal),grouping(deptno) a,grouping(job) b,grouping_id(deptno,job) from emp group by rollup(deptno,job);

    6、group_id

    GROUP_ID()唯一标识反复组,能够通过group_id去除反复组

    查询结果例如以下:

    查询语句

    select deptno,job,sum(sal),group_id() from emp group by deptno, rollup(deptno,job) having group_id()=0;

  • 相关阅读:
    Java入门学习路线目录索引(持续更新中)
    关于技术面试,面试官会怎么考察?
    什么是REST以及 RESTful?
    程序猿一般可以从什么平台接私活
    Statement常用的方法回顾
    信息网络安全协会学习总结提交规范
    20155322 2017-2018-1 《信息安全系统设计》第五周 MyBash实现
    20155322 2017-2018-1《信息安全系统设计》第五周 学习总结
    2017-2018-1 20155322 20155327 实验一 开发环境的熟悉
    20155322 2017-2018-1《信息安全系统设计》第四周学习总结
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6830388.html
Copyright © 2011-2022 走看看