当前位置:  数据库>oracle

Oracle 高级分组group by cube拓展

    来源: 互联网  发布时间:2017-06-19

    本文导语: Oracle的cube拓展功能会将cube()里指定的每一列按照顺序替换成null值,并返回指定列的所有组合。oracle的cube分组拓展主要用于替换需要通过union all和goup by 组合来实现业务功能的场景。通过该函数可以节省代码量,且使代码更加...

Oracle的cube拓展功能会将cube()里指定的每一列按照顺序替换成null值,并返回指定列的所有组合。
oracle的cube分组拓展主要用于替换需要通过union all和goup by 组合来实现业务功能的场景。通过该函数可以节省代码量,且使代码更加简洁。

实验过程如下:
首先看一下A表的内容:
HR@ORA11GR2 > select * from a;                                                                               
        A        A2        A3                                                           
---------- ---------- ----------                                                           
        1          4          5                                                           
        2          4          6                                                           
        3          4          7                                                           
        4          5          9                                                           
        5          5        10                                                           
        6          5        11                                                           
        7          5        12                                                           
        8          5        13                                                           
8 rows selected. 

若要通过union all 来实现数据组合功能:

HR@ORA11GR2 > with temp as (                                                               
  2  select a, a2 from a                                                                   
  3  union all                                                                             
  4  select a , null a2 from a                                                             
  5  union all                                                                             
  6  select null a , a2 from a                                                             
  7  union all                                                                             
  8  select null a , null a2 from a                                                         
  9  )                                                                                     
 10  select * from temp group by a, a2 order by a2 desc;                                   
        A        A2                                                                       
---------- ----------                                                                       
        1                                                                                 
        2                                                                                 
        3                                                                                 
        4                                                                                 
        5                                                                                 
        6                                                                                 
        7                                                                                 
        8           
                                                                     
        4          5                                                                       
        5          5                                                                       


        A        A2                                                                       
---------- ----------                                                                       
        6          5                                                                       
        7          5                                                                       
        8          5                                                                       
                    5                                                                       
        1          4                                                                       
        2          4                                                                       
        3          4                                                                       
                    4                                                                       


19 rows selected.   

使用cube分组拓展结果:
HR@ORA11GR2 >  select a, a2 from a group by cube(a, a2) order by a2 desc;                   


        A        A2                                                                       
---------- ----------                                                                       
        1                                                                                 
        2                                                                                 
        3                                                                                 
        4                                                                                 
        5                                                                                 
        6                                                                                 
        7                                                                                 
        8                                                                                 


        4          5                                                                       
        5          5                                                                       


        A        A2                                                                       
---------- ----------                                                                       
        6          5                                                                       
        7          5                                                                       
        8          5                                                                       
                    5                                                                       
        1          4                                                                       
        2          4                                                                       
        3          4                                                                       
                    4                                                                       
19 rows selected.   


从上面的输出中,我们会发现cube会将许多的null值,如果cube()里指定的列本身就具有null值,又需要如何区分呢?

解决方法为通过grouping()函数来排除null值,例如grouping(a)来检测A表中a列是否有一行null值是由cube产生的,如果有,则返回1,其他所有情况,则返回0.

接着再结合decode()函数或case表达式,来将cube()产生的null值转化成通俗易懂的字符串。


 实验如下:


HR@ORA11GR2 > select decode(grouping(a),1,'cube_value',a) a , decode(grouping(a2), 1, 'cube_value',a2) a2 from a group by cube(a, a2) order by a2 desc;

 


A                                        A2

---------------------------------------- ----------------------------------------

cube_value                        cube_value

4                                        cube_value

8                                        cube_value

7                                        cube_value

6                                        cube_value

5                                        cube_value

3                                        cube_value

2                                        cube_value

1                                        cube_value

cube_value                              5

6                                        5

 


A                                        A2

---------------------------------------- ----------------------------------------

8                                        5

7                                        5

4                                        5

5                                        5

1                                        4

cube_value                        4

3                                        4

2                                        4

19 rows selected.


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在linux (red hat9)装oracle 9i的问题,unix group name过不了,这是为什么?
  • oracle group by语句实例测试
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • HTML教程 iis7站长之家
  • 请问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,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3