网上有个示例:
select  * from sales group by rollup(stor_id,qty);但是没有搞明白,已经group by分组了一次,还要rollup再来一次,这不是多余吗?因为已经分组了啊,再如何分呢?还有那个什么cube是做什么的,也不太懂,懂的朋友告诉下,这个rollup到底该怎么用啊?
谢谢!

解决方案 »

  1.   

    CUBE   运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。  
       
      CUBE   运算符在   SELECT   语句的   GROUP   BY   子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP   BY   应指定维度列和关键字   WITH   CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值  
      --------------  
      用   ROLLUP   汇总数据  
      在生成包含小计和合计的报表时,ROLLUP   运算符很有用。ROLLUP   运算符生成的结果集类似于   CUBE   运算符所生成的结果集。有关更多信息,请参见用   CUBE   汇总数据。    
       
      CUBE   和   ROLLUP   之间的区别在于:    
       
      CUBE   生成的结果集显示了所选列中值的所有组合的聚合。  
       
       
      ROLLUP   生成的结果集显示了所选列中值的某一层次结构的聚合
      

  2.   

    rollup,cube子句在ORACLE中可以用来做交叉报表,如:如总计,小计类的功能很容易实现;但是必须和group by 子句一起使用。举例如下:Oracle的Cube,Rollup子句的用法产生交叉报表的情况,演示一个cube的例子
      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的总销售收入
      

  3.   

    cube,rollup简单来说就是做汇总啊
    比如
    我们公司每天各地方都有订单
    需要分组统计当天各地区的订单总数,用group  by 分级求和就行了
    如果要求当天总的,那就SUM一下就行了
    不过需要在同一个语句里即要显示各地方的汇总,又要显示总的数量
    怎么办呢
    1种方法用union all把两句不同的语句连接起来
    这相当于对同一张表访问两次第二种方法就是用cube,rollup,这样一次访问表就可以解决了
      

  4.   

    --Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。CUBE  运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。  
      
      CUBE  运算符在  SELECT  语句的  GROUP  BY  子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP  BY  应指定维度列和关键字  WITH  CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值  
      --------------  
      用  ROLLUP  汇总数据  
      在生成包含小计和合计的报表时,ROLLUP  运算符很有用。ROLLUP  运算符生成的结果集类似于  CUBE  运算符所生成的结果集。有关更多信息,请参见用  CUBE  汇总数据。    
      
      CUBE  和  ROLLUP  之间的区别在于:    
      
      CUBE  生成的结果集显示了所选列中值的所有组合的聚合。  
      
      
      ROLLUP  生成的结果集显示了所选列中值的某一层次结构的聚合