新建一个表:
CREATE TABLE tt (产地 varchar(20), 水果 varchar(20),重量 number);
INSERT into tt VALUES ('北方','香蕉',3);
INSERT into tt VALUES ('北方','水蜜桃',2) ;
INSERT into tt VALUES ( '南方','桔子',3) ;
INSERT into tt VALUES ( '北方','水蜜桃',5) ;
INSERT into tt VALUES ( '南方','香蕉',3) ;
INSERT into tt VALUES ( '南方','水蜜桃',6);
INSERT into tt VALUES ( '北方','桔子' ,8);
一般的group by语句:
按产地分类
select tt.产地,sum(tt.重量)
from tt
group by tt.产地;
结果为:
或者按水果分类:
select tt.水果,sum(tt.重量)
from tt
group by tt.水果;
1.rollup 的作用:
1.1 传递一行:
代码为:
select tt.水果,sum(tt.重量)
from tt
group by rollup(tt.水果);
加入一行汇总的内容。
1.2传递多列
先看普通代码:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by tt.水果,tt.产地;
结果当然与原表一致;
加入rollup:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by rollup(tt.水果,tt.产地);
结果为:
优先按 水果总类汇总,然后 再 将所有的重量汇总。若将 tt.产地 与 tt水果 交换位置,则优先按 产地汇总,然后再讲所有的重量汇总。
而若将
tt.产地 移出括号外面,代码为:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by rollup(tt.水果),tt.产地;
结果按 产地 汇总,但是不进行 所有的汇总。交换 tt.产地 和 rollup(tt.水果) 的group by 顺序,结果不变。
则易知若将 tt.水果 移出括号外面,代码为:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by rollup(tt.产地),tt.水果;
结果为:
按水果类型汇总, 不进行 所有的汇总,交换 tt.水果 和 rollup(tt.产地) 的group by 顺序,结果不变。
2.Cube的作用
2.1 向 cube传入一行
结果与rollup 区别貌似不大,只是汇总结果默认在上面。
2.2向 cube传入多行
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by cube(tt.水果,tt.产地);
结果为:
可见,汇总结果为:先显示所有内容的汇总,再输出按产地的汇总,再输出按水果类型的汇总,且原表的数据也都输出了。现在交换 产地 和 水果 的位置:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by cube(tt.产地,tt.水果);
结果为:
可见,结果为:先显示所有内容的汇总,再输出按水果类型的汇总,再输出按产地的汇总,且原表的数据也都输出了。现在讲 产地移到括号外面:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by cube(tt.水果),tt.产地;
结果为:
只按产地汇总,且汇总的数据先输出。交换 cube(tt.水果) 和 tt.产地,代码为:
select tt.水果,tt.产地,sum(tt.重量)
from tt
group by cube(tt.产地),tt.水果;
结果为:
可见,只按水果类型汇总,且汇总的数据先输出。
相信 通过以上的例子,可以看出rollup和cube的作用以及他们的区别了。