【oracle】分析函数之Rollup&Cube
| 分类: oracle |
Rollup():分组函数可以理解为group by的精简模式,具体分组模式如下:
Rollup(a,b,c): (a,b,c),(a,b),(a),(全表)
Cube():分组函数也是以group by为基础,具体分组模式如下:
cube(a,b,c):(a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),(全表)
下面准备数据比较一下两个函数的不同:
1、准备数据:
http://s10/mw690/002j5aIUty6EBgddQCJd9&690
2、使用rollup函数查询
select group_id,job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);
http://s3/mw690/002j5aIUty6EBgxK9Wi22&690
http://s13/mw690/002j5aIUty6EBgxLKgYac&690
3、使用cube函数:
select group_id,job,name,sum(salary) from GROUP_TEST group by cube(group_id,job,name)
http://s2/mw690/002j5aIUty6EBhbWUyl31&690
http://s13/mw690/002j5aIUty6EBhbZvQw1c&690
http://s4/mw690/002j5aIUty6EBhc1ogb23&690
http://s4/mw690/002j5aIUty6EBhc2zU7f3&690
http://s16/mw690/002j5aIUty6EBhefirB7f&690
4、对比:从最后查询出来的数据条数就差了好多,下面看一下将两个函数从转化成对应的group函数语句:
rollup函数:
select group_id,job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);
等价于:
select group_id,job,name,sum(salary) from GROUP_TEST group by
group_id,job,name
union all
select group_id,job,null,sum(salary) from GROUP_TEST group by
group_id,job
union all
select group_id,null,null,sum(salary) from GROUP_TEST group by
group_id
union all
select null,null,null,sum(salary) from GROUP_TEST
cube函数:
select group_id,job,name,sum(salary) from GROUP_TEST group by cube(group_id,job,name) ;
等价于:
select group_id,job,name,sum(salary) from GROUP_TEST group by
group_id,job,name
union all
select group_id,job,null,sum(salary) from GROUP_TEST group by
group_id,job
union all
select group_id,null,name,sum(salary) from GROUP_TEST group by
group_id,name
union all
select group_id,null,null,sum(salary) from GROUP_TEST group by
group_id
union all
select null,job,name,sum(salary) from GROUP_TEST group by
job,name
union all
select null,job,null,sum(salary) from GROUP_TEST group by job
union all
select null,null,name,sum(salary) from GROUP_TEST group by
name
union all
select null,null,null,sum(salary) from GROUP_TEST
5、由此可见两个函数对于汇总统计来说要比普通函数好用的多,另外还有一个配套使用的函数
grouping(**):当**字段为null的时候值为1,当字段**非null的时候值为0;
select grouping(group_id),job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);
6、添加一列用来直观的显示所有的汇总字段:
select group_id,job,name,
sum(salary) from GROUP_TEST group by cube(group_id,job,name)
;

加载中…