Oracle的CUBE与ROLLUP功能很相似,也是在数据统计分析领域的一把好手。

关于ROLLUP的查询统计功能请参考文章《Oracle分组函数之ROLLUP魅力》(http://www.linuxidc.com/Linux/2012-08/67357.htm)。

1.先看一下ROLLUP的数据统计效果

1)创建测试表group_test

SECOOLER@ora11g> create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);

Table created.

2)初始化数据

insert into group_test values (10,'Coding',    'Bruce',1000);

insert into group_test values (10,'Programmer','Clair',1000);

insert into group_test values (10,'Architect', 'Gideon',1000);

insert into group_test values (10,'Director',  'Hill',1000);

insert into group_test values (20,'Coding',    'Jason',2000);

insert into group_test values (20,'Programmer','Joey',2000);

insert into group_test values (20,'Architect', 'Martin',2000);

insert into group_test values (20,'Director',  'Michael',2000);

insert into group_test values (30,'Coding',    'Rebecca',3000);

insert into group_test values (30,'Programmer','Rex',3000);

insert into group_test values (30,'Architect', 'Richard',3000);

insert into group_test values (30,'Director',  'Sabrina',3000);

insert into group_test values (40,'Coding',    'Samuel',4000);

insert into group_test values (40,'Programmer','Susy',4000);

insert into group_test values (40,'Architect', 'Tina',4000);

insert into group_test values (40,'Director',  'Wendy',4000);

commit;

3)初始化之后的数据情况如下:

SECOOLER@ora11g> set pages 100

SECOOLER@ora11g> select * from group_test;

GROUP_ID JOB        NAME           SALARY

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

        10 Coding     Bruce            1000

        10 Programmer Clair            1000

        10 Architect  Gideon           1000

        10 Director   Hill             1000

        20 Coding     Jason            2000

        20 Programmer Joey             2000

        20 Architect  Martin           2000

        20 Director   Michael          2000

        30 Coding     Rebecca          3000

        30 Programmer Rex              3000

        30 Architect  Richard          3000

        30 Director   Sabrina          3000

        40 Coding     Samuel           4000

        40 Programmer Susy             4000

        40 Architect  Tina             4000

        40 Director   Wendy            4000

16 rows selected.

4)ROLLUP的数据统计效果

sec@ora10g> select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by rollup(group_id, job);

GROUP_ID JOB        GROUPING(GROUP_ID) GROUPING(JOB) SUM(SALARY)

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

        10 Coding                      0             0        1000

        10 Director                    0             0        1000

        10 Architect                   0             0        1000

        10 Programmer                  0             0        1000

        10                             0             1        4000

        20 Coding                      0             0        2000

        20 Director                    0             0        2000

        20 Architect                   0             0        2000

        20 Programmer                  0             0        2000

        20                             0             1        8000

        30 Coding                      0             0        3000

        30 Director                    0             0        3000

        30 Architect                   0             0        3000

        30 Programmer                  0             0        3000

        30                             0             1       12000

        40 Coding                      0             0        4000

        40 Director                    0             0        4000

        40 Architect                   0             0        4000

        40 Programmer                  0             0        4000

        40                             0             1       16000

                                       1             1       40000

21 rows selected.

2.进一步体验CUBE的魅力

sec@ora10g> select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by cube(group_id, job) order by 1;

GROUP_ID JOB        GROUPING(GROUP_ID) GROUPING(JOB) SUM(SALARY)

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

        10 Architect                   0             0        1000

        10 Coding                      0             0        1000

        10 Director                    0             0        1000

        10 Programmer                  0             0        1000

        10                             0             1        4000

        20 Architect                   0             0        2000

        20 Coding                      0             0        2000

        20 Director                    0             0        2000

        20 Programmer                  0             0        2000

        20                             0             1        8000

        30 Architect                   0             0        3000

        30 Coding                      0             0        3000

        30 Director                    0             0        3000

        30 Programmer                  0             0        3000

        30                             0             1       12000

        40 Architect                   0             0        4000

        40 Coding                      0             0        4000

        40 Director                    0             0        4000

        40 Programmer                  0             0        4000

        40                             0             1       16000

           Architect                   1             0       10000

           Coding                      1             0       10000

           Director                    1             0       10000

           Programmer                  1             0       10000

                                       1             1       40000

25 rows selected.

解释如上结果中GROUPING函数返回值“0”和“1”的含义。

  如果显示“1”表示CUBE函数对应的列(例如JOB字段)是由于CUBE函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。

  如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。

  如果还是没有理解清楚,请参见Oracle官方文档中的描述内容:“Using a single column as its argument,GROUPINGreturns 1 when it encounters aNULLvalue created by aROLLUPorCUBEoperation. That is, if theNULLindicates the row is a subtotal,GROUPINGreturns a 1. Any other type of value, including
a storedNULL, returns a 0.”

3.仔细观察一下,CUBE与ROLLUP之间的细微差别

rollup(a,b)   统计列包含:(a,b)、(a)、()

rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()

……以此类推ing……

cube(a,b)     统计列包含:(a,b)、(a)、(b)、()

cube(a,b,c)   统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

……以此类推ing……

So,上面例子中CUBE的结果比ROLLUP多了下面关于第一列GROUP_ID的统计信息:

           Architect                   1             0       10000

           Coding                      1             0       10000

           Director                    1             0       10000

4.小结

  CUBE在ROLLUP的基础上进一步从各种维度上给出细化的统计汇总结果。

  CUBE与GROUP BY的关系可以参考Oracle官方文档中的例子,链接如下:,链接如下:《CUBE Extension to GROUP BY》http://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8614

Oracle分组函数之CUBE魅力的更多相关文章

  1. 【转】【CUBE】Oracle分组函数之CUBE魅力

    http://blog.itpub.net/519536/viewspace-610997/ Oracle的CUBE与ROLLUP功能很相似,也是在数据统计分析领域的一把好手.  关于ROLLUP的查 ...

  2. [转]【ROLLUP】Oracle分组函数之ROLLUP魅力

    原创:http://blog.itpub.net/519536/viewspace-610995 本文通过演示给出Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅 ...

  3. Oracle分组函数之CUBE

    功能介绍: 首先是进行无字段的聚合,然后依次对每个字段进行聚合 创建表: 插入测试数据: ROLLUP: Select t.classid,t.studentname,Sum(t.score) Fro ...

  4. Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  5. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  6. oracle 分组函数执行分析

    先上例了: select job as "JOB1", avg(sal) as "avg sal" from scott.emp group by " ...

  7. Oracle分组函数以及数据分组

    简单总结一下对于数据的分组和分组函数. 本文所举实例,数据来源oracle用户scott下的emp,dept ,salgrade 3表:数据如下: 一.分组函数 1.sum()求和函数.max()求最 ...

  8. Oracle 分组函数

    分组函数的介绍 分组函数作用于一组数据,并对一组数据返回一个值. (引用网上的一张图) 分组函数的使用规则 SELECT [column,] group_function(column) FROM t ...

  9. Oracle分组函数实例

    分组函数也叫聚合函数.如果在查询只想要查分组函数,那么跟平时的查询语句并无不同: SQL ,,,,) ; SUM(T.PRIZENUM) AVG(T.PRIZENUM) --------------- ...

随机推荐

  1. Unix基本系统数据类型和stat结构体

    Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主.次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要 ...

  2. c语言入门教程

    https://www.youtube.com/playlist?list=PLY_qIufNHc293YnIjVeEwNDuqGo8y2Emx 感觉这个教程不错

  3. .net中对HTTP请求的两种请求:Get和Post的操作

    .net中对HTTP请求的简单操作总结 第一部分,HTTP协议的简单了解 一.           什么是HTTP协议 超文本传输协议 (HTTP-Hypertext transfer protoco ...

  4. (树)根据排序数组或者排序链表重新构建BST树

    题目一:给定一个数组,升序数组,将他构建成一个BST 思路:升序数组,这就类似于中序遍历二叉树得出的数组,那么根节点就是在数组中间位置,找到中间位置构建根节点,然后中间位置的左右两侧是根节点的左右子树 ...

  5. Java List集合和Map集合的综合应用

    public static void main(String[] args) { //--------------------------------------------------------- ...

  6. HTML__图片轮播ion-slide-box

    先大概描述一下要做的界面: 从网络请求json数据,获取网络图征数据,然后轮播图片.我遇到的问题是:图片不显示,代码如下 <ion-slide-box does-continue="t ...

  7. Windows下配置Visualsvn Server时需要注意的几点事项

    1配置用户组与用户 用户组的权限高于用户的权限, 如果一个用户只有只读权限,同时被加入了拥有写权限的用户组中,此用户可以执行写操作. 2在Pre-commit hook下增加 强制添加注释的钩子脚本 ...

  8. 我用Django搭网站(1)-新浪微博登录

    新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者. OAuth简介 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提 ...

  9. angular 引入第三方库

    第一步 --save:自动写入package.json 第二步: 第三部: 为了让typescript识别$ 第四步:

  10. HTML4.0 需要掌握的主要内容

    常用标签: <html></html> 创建一个HTML文档 <head></head> 设置文档标题和其它在网页中不显示的信息 <title&g ...