Oracle ROLLUP和CUBE 用法

一、 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),…… 這樣任意按本身想要的形式結合統計數據,很是方便。
 
二、實例
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);   
      www.2cto.com  
  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個字段的狀況:     www.2cto.com  
  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)分組累計,最後累計所有    www.2cto.com   
  再看看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  
相關文章
相關標籤/搜索