oracle:cube,rollup
以下数据出于《Oracle.10g.Pl.SQL编程》
CUBE ROLLUP 是用于统计数据的
通常只用 GRUOP BY得到的数据如下
SELECT deptno,job, avg(sal) FROM table_name GROUP BY (deptno, job);
加上 ROLLUP
如果用 CUBE
注意不同,第二个表多了每行的平均数,还有全部数据的平均数
第3个表在第二个表上多了每列的平均数
下面介绍这两个函数:
ROLLUP
为每个分组返回一条小计记录,并为全部分组返回总计
SELECT deptno,job, avg(sal) FROM table_name GROUP BY ROLLUP(deptno, job);
CUBE
返回所有列组合的小计信息,同时在最后显示总计信息
SELECT deptno,job, avg(sal) FROM table_name GROUP BY CUBE(deptno, job);
GROUPING(column_name)
对输入列返回0或1,如果该行数据使用了数据的列中的信息,则输出0,没有用到则输出1
或者这么理解,对于该行得出的统计数据,需要从 输入列中选择数据的话,输出0,不需要选择数据的就输出1
eg:
求部门1 职位j 的平均工资,对于输入 GRUOPING(deptno)和 GROUPING(job) 来说,都为0
如果只是统计部门1的平均工资对于输入 GRUOPING(deptno)和 GROUPING(job) 来说,前0后1
如果统计全部部门全部职位一起的平均工资,两者都为1
GROUPING SETS(column_name)
只返回统计信息,就是上图中 提出两个 GROUPING 都为0的情况,两者为1的那个也剔除。
SELECT deptno,job, avg(sal) FROM table_name GROUP BY GROUPING SETS(deptno, job);
GROUPING_ID(column_name1,column_name2…)
这个返回一个整数,最小为0,这个整数怎么确定,将上面的输入的列,分配以bit,column_name1 的在column_name2的左边,
这样就形成了一个二进制数,将它转为10进制就是获得的数了,
怎么确定每位的0和1?
每位的值,和 GROUPING(column_name)的值是一样的,
例如上面的GROUPING(column_name1) GROUPING(column_name2) 为1 和0
则获得的值为 0b10 ,即2.