`

Oracle ROLLUP和CUBE 用法

阅读更多

rollup只有第一个参数起作用也是理解不正确的,先看看例子吧:

 

 SQL>   select   grade,id,num   from   a;  
   
  GRADE             ID                                 NUM  
  ----------   ----------   ----------  
  a                     1                                       1  
  a                     2                                       2  
  b                     3                                       4  
  b                     4                                       4  
   
  对grade字段进行rollup:  
   
  SQL>   select   grade,sum(num)   from   a   group   by   rollup(grade);  
   
  GRADE                 SUM(NUM)  
  ----------   ----------  
  a                                       3  
  b                                       8  
                                        11  
  同时对grade和id字段进行rollup  
  SQL>   SELECT   decode(grouping_id(grade,ID),2,'小计',3,'合计',grade)   grade,  
      2                   decode(grouping_id(grade,ID),1,'小计',3,'合计',ID)   ID,  
      3                   SUM(num)  
      4     FROM   a   GROUP   BY   ROLLUP(grade,ID)  
      5     /  
   
  GRADE             ID                       SUM(NUM)  
  ----------   ----------   ----------  
  a                     1                                       1  
  a                     2                                       2  
  a                     小计                                 3  
  b                     3                                       4  
  b                     4                                       4  
  b                     小计                                 8  
  合计               合计                               11  
   
  7   rows   selected  
   
  再看看先对grade分组,再对id进行rollup的情况:  
   
  SQL>   SELECT   grade,  
      2                   decode(GROUPING(ID),1,'合计',ID)   ID,  
      3                   SUM(num)  
      4     FROM   a   GROUP   BY   grade,rollup(ID)  
      5     /  
   
  GRADE             ID                       SUM(NUM)  
  ----------   ----------   ----------  
  a                     1                                       1  
  a                     2                                       2  
  a                     合计                                 3  
  b                     3                                       4  
  b                     4                                       4  
  b                     合计                                 8  
   
  6   rows   selected  
   
  这里GROUP   BY   grade,rollup(ID)跟你的理解应该很相近了,而且可以看出GROUP   BY   grade,rollup(ID)结果跟ROLLUP(grade,ID)很类似,只是少了最后1行总合计,但是也可以就看出rollup多个字段时并不是只有1个字段起作用的  
   
  可以认为你理解的是只对第一个字段的累计,跟GROUP   BY   grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:  
  SQL>   select   part,grade,id,num   from   a;  
   
  PART   GRADE             ID                                 NUM  
  ----   ----------   ----------   ----------  
  p1       a                     1                                       1  
  p1       a                     2                                       2  
  p1       b                     3                                       3  
  p1       b                     4                                       4  
  p2       c                     5                                       5  
  p2       d                     6                                       6  
   
  6   rows   selected  
   
  SQL>    
  SQL>   SELECT   decode(grouping_id(part,grade,ID),7,'总计',part)   part,  
      2                   decode(grouping_id(part,grade,ID),3,'小计',7,'总计',grade)   grade,  
      3                   decode(grouping_id(part,grade,ID),1,'小计',3,'小计',7,'总计',ID)   ID,  
      4                   SUM(num)  
      5     FROM   a   GROUP   BY   ROLLUP(part,grade,ID)  
      6     /  
   
  PART   GRADE             ID                       SUM(NUM)  
  ----   ----------   ----------   ----------  
  p1       a                     1                                       1  
  p1       a                     2                                       2  
  p1       a                     小计                                 3  
  p1       b                     3                                       3  
  p1       b                     4                                       4  
  p1       b                     小计                                 7  
  p1       小计               小计                               10  
  p2       c                     5                                       5  
  p2       c                     小计                                 5  
  p2       d                     6                                       6  
  p2       d                     小计                                 6  
  p2       小计               小计                               11  
  总计   总计               总计                               21  
   
  13   rows   selected  
   
  这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部  
  再看看rollup   和   cube的区别:  
  对于ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值范围在(0,1,3,7)间即  
  part,grade,ID(作为合计时计为1)  
  0,0,0  
  0,0,1  
  0,1,1  
  1,1,1  
  而对于cube(part,grade,ID),grouping_id(part,grade,ID)的值范围在0-7之间即  
  part,grade,ID(作为合计时计为1)  
  0,0,0  
  0,0,1  
  0,1,0  
  0,1,1  
  1,0,0  
  1,0,1  
  1,1,0  

分享到:
评论
1 楼 dolphin_ygj 2009-06-28  
CREATE   TEST   TABLE   AND   INSERT   TEST   DATA.  
                                  create   table   students  
                                  (id   number(15,0),  
                                  area   varchar2(10),  
                                  stu_type   varchar2(2),  
                                  score   number(20,2));  
                                   
                                  insert   into   students   values(1,   '111',   'g',   80   );  
                                  insert   into   students   values(1,   '111',   'j',   80   );  
                                  insert   into   students   values(1,   '222',   'g',   89   );  
                                  insert   into   students   values(1,   '222',   'g',   68   );  
                                  insert   into   students   values(2,   '111',   'g',   80   );  
                                  insert   into   students   values(2,   '111',   'j',   70   );  
                                  insert   into   students   values(2,   '222',   'g',   60   );  
                                  insert   into   students   values(2,   '222',   'j',   65   );  
                                  insert   into   students   values(3,   '111',   'g',   75   );  
                                  insert   into   students   values(3,   '111',   'j',   58   );  
                                  insert   into   students   values(3,   '222',   'g',   58   );  
                                  insert   into   students   values(3,   '222',   'j',   90   );  
                                  insert   into   students   values(4,   '111',   'g',   89   );  
                                  insert   into   students   values(4,   '111',   'j',   90   );  
                                  insert   into   students   values(4,   '222',   'g',   90   );  
                                  insert   into   students   values(4,   '222',   'j',   89   );  
                                  commit;  
                   
                                  col   score   format   999999999999.99  
  ROLLUP  
                   
                                  select   id,area,stu_type,sum(score)   score    
                                  from   students  
                                  group   by   rollup(id,area,stu_type)  
                                  order   by   id,area,stu_type;  
                                   
                                  /*--------理解rollup  
                                  select   a,   b,   c,   sum(   d   )  
                                  from   t  
                                  group   by   rollup(a,   b,   c);  
                                   
                                  等效于  
                                   
                                  select   *   from   (  
                                    select   a,   b,   c,   sum(   d   )   from   t   group   by   a,   b,   c    
                                    union   all  
                                    select   a,   b,   null,   sum(   d   )   from   t   group   by   a,   b  
                                    union   all  
                                    select   a,   null,   null,   sum(   d   )   from   t   group   by   a  
                                    union   all  
                                    select   null,   null,   null,   sum(   d   )   from   t  
                                  )  
                                  */  
                   
  CUBE  
                   
                                  select   id,area,stu_type,sum(score)   score    
                                  from   students  
                                  group   by   cube(id,area,stu_type)  
                                  order   by   id,area,stu_type;  
                                   
                                  /*--------理解cube  
                                  select   a,   b,   c,   sum(   d   )   from   t  
                                  group   by   cube(   a,   b,   c)  
                                   
                                  等效于  
                                   
                                  select   a,   b,   c,   sum(   d   )   from   t  
                                  group   by   grouping   sets(    
                                            (   a,   b,   c   ),    
                                            (   a,   b   ),   (   a   ),   (   b,   c   ),    
                                            (   b   ),   (   a,   c   ),   (   c   ),    
                                            ()   )  
                                  )  
                                  */  
   
    GROUPING  
                   
                                  从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,  
                                  如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!  
                                   
                                  select   decode(grouping(id),1,'all   id',id)   id,  
                                                  decode(grouping(area),1,'all   area',to_char(area))   area,  
                                                  decode(grouping(stu_type),1,'all_stu_type',stu_type)   stu_type,  
                                                  sum(score)   score  
                                  from   students  
                                  group   by   cube(id,area,stu_type)  
                                  order   by   id,area,stu_type;

相关推荐

    Oracle_Database_11g完全参考手册.part2/3

    14.3 使用ROLLUP、GROUPING和CUBE 14.4 家族树和COlLrlectby 14.4.1 排除个体和分支 14.4.2 向根遍历 14.4.3 基本规则 第15章 更改数据:插入、更新、合并和删除 第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 ...

    Oracle_Database_11g完全参考手册.part3/3

    14.3 使用ROLLUP、GROUPING和CUBE 14.4 家族树和COlLrlectby 14.4.1 排除个体和分支 14.4.2 向根遍历 14.4.3 基本规则 第15章 更改数据:插入、更新、合并和删除 第16章 DECODE和CASE.SQL中的if-fhen-else 第17章 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    精通Oracle.10g.PLSQL编程

    使用SQL语句 4.1 使用基本查询 4.1.1 简单查询语句 4.1.2 ...使用事务控制语句 4.3.1 事务和锁 4.3.2 提交事务 4.3.3 回退事务 4.3.4 只读事务 4.3.5 顺序事务 4.4 数据...

    oracle分析函数

    ·1Oracle分析函数一——函数列表 ·2Oracle分析函数二——函数用法 ·3Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT ·4Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST...·8Oracle分析函数八——CUBE,ROLLUP

    Oracle数据库实验操作

    实验28:高级分组rollup,cube操作 65 实验29:树结构的查询start with子句 66 实验30:高级dml操作 68 第二部分pl/sql基础 69 匿名块的编写 69 实验31:书写一个最简单的块,运行并查看结果 69 实验32:在块中操作...

    group by的多种用法

    详细介绍了cube、rollup、grouping sets的原理及用法

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...

    jpivot学习总结.doc

    <jp:mondrianQuery dataSource="" id="query01" jdbcDriver="oracle.jdbc.driver.OracleDriver" jdbcUrl="jdbc:oracle:thin:ngykt/ngyktadmin@172.16.46.241:1521:orcl10" catalogUri="/WEB-INF/queries/feeSchema....

    C#.net_经典编程例子400个

    142 3.6 Process组件 143 实例102 使用Process组件访问本地进程 143 3.7 Timer组件 145 实例103 使用Timer组件制作计时器 145 实例104 使用Timer组件显示当前系统时间 150 实例105 ...

    C#程序开发范例宝典(第2版).part08

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    C#程序开发范例宝典(第2版).part13

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    C#程序开发范例宝典(第2版).part02

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    C#程序开发范例宝典(第2版).part12

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

Global site tag (gtag.js) - Google Analytics