日期:2014-05-16  浏览次数:20489 次

谈GROUP BY 中的ROLLUP函数
rollup(a,b)的特点是,先安(a,b)一起汇总统计,然后再按照A进行汇总统计,最后是对所有的统计再统计。

ROLLUP中的参数可以多个,形式也多样,例如包含在()内的参数如果有多个,但是又想对某些进行列绑定按照一个列处理,

则可以嵌套()。下例中的第二就是如此:



例1:

select a.khh,b.jjrxm,a.cjrq, sum(a.cjje) total from tjgmxls a,tkhxx b    
      where b.jjrbh(+)=a.khh and cjrq<20070201
      group by rollup(khh,jjrxm,cjrq);



例2:

select a.khh,b.jjrxm,a.cjrq, sum(a.cjje) total from tjgmxls a,tkhxx b    
      where b.jjrbh(+)=a.khh and cjrq<20070201
      group by rollup((khh,jjrxm),cjrq);

例3:

   有表格数据如下,

   SQL> select * from test_Value;

      MONS JJR               CJL       CJJE
---------- ---------- ---------- ----------
    200801 LZF               100       1000
    200802 LZF               200       2000
    200803 LZF               300       1000
    200801 wth               300       1000
    200802 wth               100        500
    200803 wth              1000       4000
6 rows selected

  在其上做一些比较复杂的查询

   -------

  SQL> select decode(jjr,null,'汇总',jjr),
  2    sum(cjl) ttl_cjl, sum(cjje), avg(cjl), sum(cjl) / sum(cjje)
  3    from test_value
  4   group by rollup(jjr)
  5   order by ttl_cjl
  6  /

DECODE(JJR,NULL,'汇总',JJR)    TTL_CJL  SUM(CJJE)   AVG(CJL) SUM(CJL)/SUM(CJJE)
--------------------------- ---------- ---------- ---------- ------------------
LZF                                600       4000        200               0.15
wth                               1400       5500 466.666666  0.254545454545455
汇总                              2000       9500 333.333333  0.210526315789474

这是比较集成的查询使用到统计,rollup,decode,order等功能