zoukankan      html  css  js  c++  java
  • ORACLE GROUPING函数的使用(转摘) joe

    GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

    关于ROLLUP和CUBE函数的使用,请参见我的另一篇文章。

    http://blog.csdn.net/wh62592855/archive/2009/11/16/4817920.aspx

    1、在ROLLUP中对单列使用GROUPING()

    SQL> select division_id,sum(salary)
      2  from employees2
      3  group by rollup(division_id)
      4  order by division_id;

    DIV SUM(SALARY)
    --- -----------
    BUS     1610000
    OPE     1320000
    SAL     4936000
    SUP     1015000
            8881000

    加上GROUPING来看看

    SQL> select grouping(division_id),division_id,sum(salary)
      2  from employees2
      3  group by rollup(division_id)
      4  order by division_id;

    GROUPING(DIVISION_ID) DIV SUM(SALARY)
    --------------------- --- -----------
                        0 BUS     1610000
                        0 OPE     1320000
                        0 SAL     4936000
                        0 SUP     1015000
                        1         8881000
    可以看到,为空的地方返回1,非空的地方返回0。

    2、使用CASE转换GROUPING()的返回值

    可能你会觉得前面的0和1太枯燥了,代表不了任何意义,说白了就是不够人性化,呵呵。这个时候我们可以使用CASE来转换为一些有意义的值。

    SQL> select
      2  case grouping(division_id)
      3  when 1 then 'all divisions'
      4  else division_id
      5  end as div,
      6  sum(salary)
      7  from employees2
      8  group by rollup(division_id)
      9  order by division_id;

    DIV           SUM(SALARY)
    ------------- -----------
    BUS               1610000
    OPE               1320000
    SAL               4936000
    SUP               1015000
    all divisions     8881000

    3、使用CASE和GROUPING()转换多个列的值

    SQL> select
      2  case grouping(division_id)
      3  when 1 then 'all divisions'
      4  else division_id
      5  end as div,
      6  case grouping(job_id)
      7  when 1 then 'all jobs'
      8  else job_id
      9  end as job,
     10  sum(salary)
     11  from employees2
     12  group by rollup(division_id,job_id)
     13  order by division_id,job_id;

    DIV           JOB      SUM(SALARY)
    ------------- -------- -----------
    BUS           MGR           530000
    BUS           PRE           800000
    BUS           WOR           280000
    BUS           all jobs     1610000
    OPE           ENG           245000
    OPE           MGR           805000
    OPE           WOR           270000
    OPE           all jobs     1320000
    SAL           MGR          4446000
    SAL           WOR           490000
    SAL           all jobs     4936000

    DIV           JOB      SUM(SALARY)
    ------------- -------- -----------
    SUP           MGR           465000
    SUP           TEC           115000
    SUP           WOR           435000
    SUP           all jobs     1015000
    all divisions all jobs     8881000

    16 rows selected.

    4、CUBE与GROUPING()结合使用

    SQL> select
      2  case grouping(division_id)
      3  when 1 then 'all divisions'
      4  else division_id
      5  end as div,
      6  case grouping(job_id)
      7  when 1 then 'all jobs'
      8  else job_id
      9  end as job,
     10  sum(salary)
     11  from employees2
     12  group by cube(division_id,job_id)
     13  order by division_id,job_id;

    DIV           JOB      SUM(SALARY)
    ------------- -------- -----------
    BUS           MGR           530000
    BUS           PRE           800000
    BUS           WOR           280000
    BUS           all jobs     1610000
    OPE           ENG           245000
    OPE           MGR           805000
    OPE           WOR           270000
    OPE           all jobs     1320000
    SAL           MGR          4446000
    SAL           WOR           490000
    SAL           all jobs     4936000

    DIV           JOB      SUM(SALARY)
    ------------- -------- -----------
    SUP           MGR           465000
    SUP           TEC           115000
    SUP           WOR           435000
    SUP           all jobs     1015000
    all divisions ENG           245000
    all divisions MGR          6246000
    all divisions PRE           800000
    all divisions TEC           115000
    all divisions WOR          1475000
    all divisions all jobs     8881000

    21 rows selected.

    5、使用GROUPING SETS子句

    使用GROUPING SETS子句可以只返回小计记录。

    SQL> select division_id,job_id,sum(salary)
      2  from employees2
      3  group by grouping sets(division_id,job_id)
      4  order by division_id,job_id;

    DIV JOB SUM(SALARY)
    --- --- -----------
    BUS         1610000
    OPE         1320000
    SAL         4936000
    SUP         1015000
        ENG      245000
        MGR     6246000
        PRE      800000
        TEC      115000
        WOR     1475000

    9 rows selected.

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wh62592855/archive/2009/11/16/4818072.aspx

  • 相关阅读:
    [CSP-S模拟测试]:影子(并查集+LCA)
    [CSP-S模拟测试]:夜鹰与玫瑰(数学)
    [CSP-S模拟测试]:抛硬币(DP)
    [CSP-S模拟测试]:影魔(树状数组+线段树合并)
    [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)
    [CSP-S模拟测试]:玄学题/c(数学)
    [CSP-S模拟测试]:卡常题/b(基环树+DP)
    [CSP-S模拟测试]:工业题/a(数学)
    BZOJ5297 [Cqoi2018]社交网络 【矩阵树定理】
    BZOJ5300 [Cqoi2018]九连环 【dp + 高精】
  • 原文地址:https://www.cnblogs.com/CWater/p/1692448.html
Copyright © 2011-2022 走看看