网上有个示例:
select * from sales group by rollup(stor_id,qty);但是没有搞明白,已经group by分组了一次,还要rollup再来一次,这不是多余吗?因为已经分组了啊,再如何分呢?还有那个什么cube是做什么的,也不太懂,懂的朋友告诉下,这个rollup到底该怎么用啊?
谢谢!
select * from sales group by rollup(stor_id,qty);但是没有搞明白,已经group by分组了一次,还要rollup再来一次,这不是多余吗?因为已经分组了啊,再如何分呢?还有那个什么cube是做什么的,也不太懂,懂的朋友告诉下,这个rollup到底该怎么用啊?
谢谢!
CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值
--------------
用 ROLLUP 汇总数据
在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。有关更多信息,请参见用 CUBE 汇总数据。
CUBE 和 ROLLUP 之间的区别在于:
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合
create table test(sales varchar2(10),dest varchar2(10),revenue number);
insert into test values('smith','hangzhou',1000);
insert into test values('smith','wenzhou',2000);
insert into test values('allen','wenzhou',3000);
insert into test values('allen','wenzhou',4000);
SALES DEST REVENUE
---------- ---------- ----------
smith hangzhou 1000
smith wenzhou 2000
allen wenzhou 3000
allen wenzhou 4000
比如说我们想统计每个sales的总销售收入,每个sales在各个城市的销售收入,另外还想知道每个城市所有sales的销售收入总额,以及所有sales的总收入
就像以下报表
名字 hangzhou wenzhou 总计------- ------------ ----------- ---------
allen 7000 7000
smith 1000 2000 3000
1000 9000 10000
那我们运行下面这条语句就行了
select sales,dest,sum(revenue) from test group by cube(sales,dest);
SALES DEST SUM(REVENUE)
---------- ---------- ------------
10000 所有sales的总销售收入
wenzhou 9000 所有sales在温州的销售收入
hangzhou 1000 所有sales在杭州的销售收入
allen 7000 allen的所有销售收入
allen wenzhou 7000 allen在温州的销售收入
smith 3000 smith所有的销售收入
smith wenzhou 2000 smith在温州的销售收入
smith hangzhou 1000 smith在杭州的销售收入
8 rows selected.
如果不想统计城市这个维度,那么用rollup子句
hangzhou wenzhou
allen 7000
7000
smith 1000 2000
3000
10000
select sales,dest,sum(revenue) from test group by rollup(sales,dest)
SALES DEST SUM(REVENUE)
---------- ---------- ------------------
allen wenzhou 7000 allen在温州的销售收入
allen 7000 allen的所有销售收入
smith wenzhou 2000 smith在温州的销售收入
smith hangzhou 1000 smith在杭州的销售收入
smith 3000 smith 所有的销售收入
10000 所有sales的总销售收入
比如
我们公司每天各地方都有订单
需要分组统计当天各地区的订单总数,用group by 分级求和就行了
如果要求当天总的,那就SUM一下就行了
不过需要在同一个语句里即要显示各地方的汇总,又要显示总的数量
怎么办呢
1种方法用union all把两句不同的语句连接起来
这相当于对同一张表访问两次第二种方法就是用cube,rollup,这样一次访问表就可以解决了
CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值
--------------
用 ROLLUP 汇总数据
在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。有关更多信息,请参见用 CUBE 汇总数据。
CUBE 和 ROLLUP 之间的区别在于:
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合