Oracle分组函数之CUBE魅力(二)

2014-11-24 18:43:27 · 作者: · 浏览: 2
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