oracle中使用cube,【CUBE】Oracle分组函数之CUBE魅力

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

关于ROLLUP的查询统计功能请参考文章《【ROLLUP】Oracle分组函数之ROLLUP魅力》(http://space.itpub.net/519536/viewspace-610995)。

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

Good luck.

转载:http://space.itpub.net/519536/viewspace-610997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值