Oracle ROLLUP和CUBE 用法2

系统 1563 0

原文: http://dolphin-ygj.iteye.com/blog/416356

 

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>   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  

Oracle ROLLUP和CUBE 用法2


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论