新建一个表:
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的话,首先根据其参数的前后顺序进行分类统计,首先会根据地点进行分类,并根据地点对应的水果进行统计,然后再分别对每类地点,每类水果进行统计,最后再进行总的统计。
通过上述总结能够发现区别。