zoukankan      html  css  js  c++  java
  • oracle 中grouping

    select * from test

    1 00 001 大 5 15
    2 00 001 中 25 75
    3 00 001 小 85 25
    4 00 002 大 65 35
    5 00 002 中 95 85
    6 00 002 小 85 25
    7 01 001 大 16 14
    8 01 001 中 290 75
    9 01 001 小 83 22


    SELECT num
          ,flg
          ,(CASE WHEN GROUPING(num)=1 THEN 'TOTAL'
                 WHEN GROUPING(type)=1 THEN 'SUBTOTAL'
                 ELSE type
            END)
          ,sum(number1)
          ,sum(number2)
      FROM test
    GROUP BY ROLLUP(num,flg,type)
    ORDER BY num NULLS LAST,flg,DECODE(type,'大',1,'中',2,'小',3,4);

    1 00 001 大 5 15
    2 00 001 中 25 75
    3 00 001 小 85 25
    4 00 001 SUBTOTAL 115 115
    5 00 002 大 65 35
    6 00 002 中 95 85
    7 00 002 小 85 25
    8 00 002 SUBTOTAL 245 145
    9 00  SUBTOTAL 360 260
    10 01 001 大 16 14
    11 01 001 中 290 75
    12 01 001 小 83 22
    13 01 001 SUBTOTAL 389 111
    14 01  SUBTOTAL 389 111
    15   TOTAL 749 371

    --------------------------------------------------------------------------------

    Oracle数据库中的rollup配合group by命令使用,可以提供信息汇总功能(与"小计"相似)

    示例如下:


    SQL> select job,deptno,sal from emp;


    JOB            DEPTNO   SAL

    ---------      ---------   ---------

    CLERK          20          800

    SALESMAN   30          1600

    SALESMAN   30          1250

    MANAGER     20          2975

    SALESMAN   30          1250

    MANAGER     30          2850

    MANAGER     10          2450

    ANALYST       20          3000

    PRESIDENT   10          5000

    SALESMAN    30          1500

    CLERK          20          1100

    CLERK          30          950

    ANALYST       20          3000

    CLERK          10          1300


    已选择14行。


    SQL> select job,deptno,sum(sal) total_sal from emp group by rollup(job,deptno);


    JOB              DEPTNO     TOTAL_SAL

    ---------         ---------        ---------

    ANALYST        20              6000

    ANALYST                          6000

    CLERK           10              1300

    CLERK            20             1900

    CLERK            30               950

    CLERK                             4150

    MANAGER       10             2450

    MANAGER       20             2975

    MANAGER       30             2850

    MANAGER                        8275

    PRESIDENT     10             5000

    PRESIDENT                      5000

    SALESMAN      30             5600

    SALESMAN                       5600

                                          29025


    已选择15行。

    SQL>

    --------------------------------------------------------------------------------

    可以看出,

    用了rollup的group by子句所产生的所谓的超级聚合就是指在在产生聚合时会从右向左逐个对每一列进行小结,并在结果中生成独立的一行,同时也会对聚合列生成一个合计列。
    例如在scott用户下面有一个emp表:
    select deptno,job,sum(sal) from emp group by deptno,job;
    会对每一个不同的dept,job生成一行独立的结果。


    select deptno,job,sum(sal) from emp group by rollup(deptno,job);
    的结果中除了上述的结果结果之外,还会对每一个deptno进行一个小结,并单独生成一行,除此之外还会对所有的sal求和并生成一列。

    这里的group by后面我们仅仅接了2列,实际上我们可以使用更多列的,这样的话oracle就会以从右向左的方式来进行逐个小结。

    这里需要注意的是是使用了group by和rollup后,其后面的列要用括号括起来,否则将会出现ORA-00933: SQL 命令未正确结束的错误。

    rollup的这个用法在我们做一些复杂的中国式报表时还是能大有用武之地的。

  • 相关阅读:
    nightwatchjs --Expect element to not include text
    Iterating elements using NightWatchJS
    nightwatch 切换窗口
    nodejs读取配置文件
    spring 事务
    重载,重写,重构
    python 元组不变 列表可变
    WebStorm ES6 语法支持设置
    docker日志
    curl -O 下载文件
  • 原文地址:https://www.cnblogs.com/xd502djj/p/1832195.html
Copyright © 2011-2022 走看看