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.

原文地址:https://www.cnblogs.com/Azhu/p/2455379.html