ITPub博客

首页 > 数据库 > Oracle > cube,rollup,grouping使用

cube,rollup,grouping使用

Oracle 作者:sunyi_672 时间:2015-01-31 21:52:34 0 删除 编辑
1、Oracle ROLLUP和CUBE 用法     
      Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
       如果是Group by  ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。  www.2cto.com  
       如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。
       也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。



Oracle的Cube,Rollup子句的用法

产生交叉报表的情况,演示一个cube的例子


  create table test(sales varchar2(10),dest varchar2(10),revenue number);
  insert into test values('smith','hangzhou',1000);
  insert into test values('smith','wenzhou',2000);
  insert into test values('allen','wenzhou',3000);
  insert into test values('allen','wenzhou',4000);



SALES   DEST     REVENUE
  ---------- ---------- ----------
  smith   hangzhou     1000
  smith   wenzhou     2000
  allen   wenzhou     3000
  allen   wenzhou     4000
  
  比如说我们想统计每个sales的总销售收入,每个sales在各个城市的销售收入,另外还想知道每个城市所有sales的销售收入总额,以及所有sales的总收入
  就像以下报表
  名字   hangzhou wenzhou 总计

------- ------------ ----------- ---------
  allen        7000    7000
  smith  1000    2000    3000
       1000    9000    10000
    
  那我们运行下面这条语句就行了
  select sales,dest,sum(revenue) from test group by cube(sales,dest);
  SALES   DEST  SUM(REVENUE)
  ---------- ---------- ------------
            10000  所有sales的总销售收入
        wenzhou  9000   所有sales在温州的销售收入
       hangzhou  1000   所有sales在杭州的销售收入
  allen        7000  allen的所有销售收入
  allen   wenzhou  7000  allen在温州的销售收入
  smith        3000  smith所有的销售收入
  smith   wenzhou  2000  smith在温州的销售收入
  smith   hangzhou 1000 smith在杭州的销售收入
  8 rows selected.
  如果不想统计城市这个维度,那么用rollup子句
  
        hangzhou wenzhou
  allen   7000   
7000
  smith   1000   2000   
3000
10000
  
select sales,dest,sum(revenue) from test group by rollup(sales,dest)
  
  SALES   DEST    SUM(REVENUE)
  ---------- ---------- ------------------
  allen    wenzhou    7000  allen在温州的销售收入
  allen          7000  allen的所有销售收入
  smith   wenzhou     2000 smith在温州的销售收入
  smith   hangzhou   1000 smith在杭州的销售收入
  smith          3000  smith 所有的销售收入
               10000  所有sales的总销售收入




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



转自地址:http://blog.itpub.net/8109090/viewspace-910416/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26600495/viewspace-1422305/,如需转载,请注明出处,否则将追究法律责任。

上一篇: AMM与ASMM
请登录后发表评论 登录
全部评论

注册时间:2014-12-29

  • 博文量
    51
  • 访问量
    46988