日期:2014-05-16  浏览次数:20498 次

Oracle ROLLUP和CUBE 用法


 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     /   


备注:
grouping_id的向量值,可以认为是二进值的数,例:grouping_id(a,b,c),a为空就是0非空为1,b和c也一样,结果会得到一个三位数,用二进制转换成十进制就是了,例:a,b,c全是非空,即111就是7,三列就是7,如果是两列自然是11就是3了
   
  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