Oracle——group by 和 rollup,cube 的使用

新建一个表:

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.产地;

结果为:

北方18
南方12
select tt.产地,sum(tt.重量)
from tt
group by rollup(tt.产地);
北方18
南方12
 30

加入一行汇总的内容。

select tt.水果,tt.产地,sum(tt.重量)
from tt
group by tt.水果,tt.产地;
南方香蕉3
北方水蜜桃7
南方橘子3
南方水蜜桃6
北方橘子8
北方香蕉3

形成情况如下图所示,可以这么理解,假设第一个字段内容为m行,假设第二个字段的内容为n行,则这种方式形成的行数为m*n行

如果将上面语句中的group by 换成 group by rollup()

select tt.产地,tt.水果,sum(tt.重量)
from tt
group by rollup(tt.产地,tt.水果);--最好种类少的在rollup的前面,这样会比较清晰

 ***用group by类的函数式最好将行数少的字段写在前面,这样看起来会比较清晰,上述语句形成结果如下

北方香蕉3
北方橘子8
北方水蜜桃7
北方 18
南方香蕉3
南方橘子3
南方水蜜桃6
南方 12
  30

通过表可以看出形成的行数为m*n+m+1行,多出来的几行:根据北方汇总了以此,根据南方汇总了一次,根据总的汇总了一次。另外要注意的是group by后面参数的前后顺序,前后顺序不一致的话出来的统计结果也是不一致的 。

cube的使用(形成列数m*n+(m+n)+1)

select tt.产地,tt.水果,sum(tt.重量)
from tt
group by cube(tt.产地,tt.水果);--最好种类少的在rollup的前面,这样会比较清晰
  30
 香蕉6
 橘子11
 水蜜桃13
北方 18
北方香蕉3
北方橘子8
北方水蜜桃7
南方 12
南方香蕉3
南方橘子3
南方水蜜桃6

通过上表可以发现,利用cube的话,首先根据其参数的前后顺序进行分类统计,首先会根据地点进行分类,并根据地点对应的水果进行统计,然后再分别对每类地点,每类水果进行统计,最后再进行总的统计。

通过上述总结能够发现区别。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金哥的小超人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值