rollup(字段1,字段2):
cube(字段1,字段2):
rollup(col1,   col2,...)   和   cube(col1,   col2,...)   用法区别在  cube   在   rollup   汇总的记录集上,还会增加对 col2  等字段的汇总;  
ROLLUP只对第一个参数(字段)进行汇总,CUBE可以对参数(字段)依次汇总,所以ROLLUP中参数个数只有一个会起作用(且排名在前的参数)。
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
ROLLUP(A, B, C):
       首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。
CUBE 和 ROLLUP 之间的区别在于:
    CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
    ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
例:表 v 内容如下:
ID NAME AGE HWEILEI_1
 1 小代 11 velin
 2 小刘 12 lei
 7 小陈 29 hu
 8 小胡 12 h
以下为例:
 
 Select Id, Name ,Sum(sal) From v Group By rollup(Id,Name);
rollup:
   Select Id, Name ,Sum(age From v Group By rollup(Id,Name);

   只会对id字段进行汇总,然后求其id,name 的总汇总;
   Select Name ,Id ,Sum(sal) From v Group By rollup(Name,Id);
   只会对name字段进行汇总,然后求其name,id 的总汇总;
 Select Id, Name ,age,Sum(sal) From v Group By rollup(Id,Name,age);
  只会对id 和,id +name 进行汇总,然后对id,name,age进行全汇总;
 

cube:
 Select Id, Name ,Sum(sal) From v Group By Cube(Id,Name) Order By Id ;
  不但要对id进行汇总,还会对name进行汇总;然后再对id和name进行总汇总;
  Select Name ,Id ,Sum(sal) From v Group By Cube(Name,Id);
 不但要对name进行汇总,还会对id进行汇总;然后再对id和name进行总汇总;
 Select Id, Name ,age,Sum(sal) From v Group By Cube(Id,Name,age) Order By Id ;
先分别对id,name ,age 进行汇总,然后是id +name 进行汇总,再进行id+age进行汇总,然后再name+age进行汇总,最后再id+name+age进行汇总;
-----这里所指的汇总,是单独求此字段的汇总和!
 讲解如何在Oracle数据库中使用GROUPING SETS分组自定义。
当你与COUNT和SUM这类总计函数一起使用GROUP BY语句时,你一般得不到多级总数。GROUP BY中每个唯一的列组合生成一个总数,但这些总数不会“累加”到更高一级的总数中。
要实现这一点,你可以用GROUP BY ROLLUP或GROUP BY CUBE替代GROUP BY,不过它们会生成所有可能的总数,而你可能不需要全部总数。对GROUP BY CUBE而言, 将会生成2^n组总数这里的n是GROUP BY中列的数目
查看下面的查询,它使用了SH样本模式:
SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)

FROM sales

WHERE cust_id < 3

GROUP BY CUBE (prod_id, cust_id, channel_id)
这将生成8组总数:
所有行的总和
每个通道,包括所有产品和顾客。
每个顾客,包括所有产品和通道。
每项产品,包括所有顾客和通道。
每个通道/顾客组合,包括所有产品。
每个通道/产品组合,包括所有顾客。
每个产品/顾客组合,包括所有通道。
每个产品、顾客和通道组合。
可能的组合非常多。GROUP BY CUBE中每增加一列,生成的总数就会翻一番。
可以用GROUP BY GROUPING SETS来代替GROUP BY CUBE。你可以应用来指定你感兴趣的总数组合。因为它不必计算它不需要集合(也不会产生太多结果),所以对SQL引擎来说更为高效。
其格式为:
GROUP BY GROUPING SETS ((list), (list) ... )
这里(list)是圆括号中的一个列序列,这个组合生成一个总数。要增加一个总和,必须增加一个(NUlL)分组集。
例如,如果只要生成每项产品(包括所有顾客和通道)和每个顾客/通道组合(包括所有产品)的总数,可以输入:
SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)

FROM sales

WHERE cust_id < 3

GROUP BY GROUPING SETS (

(prod_id), (cust_id, channel_id)

);
这种方法将这个数据集生成的总数数量从180个减少到37个,并帮助你着重回答你希望解答的问题。
grouping(字段):
grouping(字段) :如果字段为0则为1,否则为0;用于group by cube或rollup子句(group by ).
如下例:
   Select  Id ,names,sum(age),grouping(Id),Grouping(names) From vv Group By Rollup(Id,names)!
grouping_id(字段1,字段2....n):
 Select  Id ,names,sum(age),grouping(Id),Grouping_id(id,names) From vv Group By Rollup (Id,names)
有了这两个函数之后,可以使用having 来去掉不要的行!
比如:
Select  Id ,names,sum(age),grouping(Id),Grouping_id(id,names) From vv Group By Rollup (Id,names) Having Grouping_id(id,names)>1;
Select  Id ,names,sum(age),grouping(Id),Grouping(names) From vv Group By Rollup(Id,names) Having Grouping(names)=1;