rollup(字段1,字段2):
cube(字段1,字段2):
rollup(col1, col2,...) 和 cube(col1, col2,...) 用法区别在 cube 在 rollup 汇总的记录集上,还会增加对 col2 等字段的汇总;
rollup只对第一个参数(字段)进行汇总,cube可以对参数(字段)依次汇总,所以rollup中参数个数只有一个会起作用(且排名在前的参数)。
oracle的group by语句除了最基本的语法外,还支持rollup和cube语句。
rollup(a, b, c):
首先会对(a、b、c)进行group by,然后对(a、b)进行group by,然后是(a)进行group by,最后对全表进行group by操作。
cube(a, b, c),则首先会对(a、b、c)进行group by,然后依次是(a、b),(a、c),(a),(b、c),(b),(c),最后对全表进行group by操作。
cube 和 rollup 之间的区别在于:
cube 生成的结果集显示了所选列中值的所有组合的聚合。
rollup 生成的结果集显示了所选列中值的某一层次结构的聚合。
例子:
create table student(
cgrade varchar2(64),
cclass varchar2(64),
cgroup varchar2(64),
stu int
)
insert into student(cgrade,cclass,cgroup,stu) values('1','1','1',10);
insert into student(cgrade,cclass,cgroup,stu) values('1','2','1',10);
insert into student(cgrade,cclass,cgroup,stu) values('1','2','2',20);
insert into student(cgrade,cclass,cgroup,stu) values('2','1','1',30);
insert into student(cgrade,cclass,cgroup,stu) values('2','2','2',40);
select * from student;
select cgrade,cclass,sum(stu) from student group by cgrade,cclass;
select cgrade,cclass,sum(stu) from student group by cube(cgrade,cclass);
select decode(grouping(cgrade),1,'学校人数',0,cgrade),decode(grouping(cclass)+grouping(cgrade),1,'年级人数',0,cclass),sum(stu) from student group by rollup(cgrade,cclass);
,
