当前位置:  数据库>oracle

Oracle rollup cube 用法

    来源: 互联网  发布时间:2017-04-28

    本文导语: 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 B...

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操作。

如果是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),…… 这样任意按自己想要的形式结合统计数据,非常方便。

2、实例

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 

















































































































更多Oracle相关信息见 专题页面


    
 
 

您可能感兴趣的文章:

  • oracle中lpad函数的用法详解
  • Oracle中decode函数的用法
  • Oracle 系统变量函数用法指南
  • oracle while的用法示例分享
  • c#中oracle to_date函数用法举例
  • oracle 下WITH CHECK OPTION用法
  • Oracle 函数用法之decode
  • Oracle sequence序列的用法
  • [Oracle] 常用工具集之SQL*Loader的用法
  • oracle case when 语句的用法详解
  • Oracle行级锁的特殊用法简析
  • Oracle merge into用法及例子
  • oracle comment命令用法示例分享
  • Oracle to_date()函数的用法介绍
  • oracle正则表达式regexp_like的用法详解
  • Oracle to_date() 用法细节
  • 深入探讨:oracle中row_number() over()分析函数用法
  • Oracle中start with...connect by prior子句用法
  • Oracle回滚段的概念,用法和规划及问题的解决
  • Oracle MERGE INTO的用法示例介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,