关于oracle中grouping()函数的详细工作原理,还有这里所设计到的,总计,和小计又是什么情况,还有在多个表中总计可以针对多个字段进行总计,或者小计吗?
 
 select 
--按照省份总计,按照省份中的人员小计
 (case when grouping(b.province_name)=1 then '总计' 
   else b.province_name end) as province_zhongxin_name,
   (case when grouping(a.owner_name)=1 and and grouping(z.name)=0
      and grouping(b.province_name)=0 then '小计' else a.owner_name end) as owner_name,
      
      ('2000-01-01~2010-06-23') as statistictime_range,
(trunc((to_date('2010-06-23','yyyy-mm-dd')-to_date('2000-01-01','yyyy-mm-dd'))*1.0/7)) as week_num,
count(a.owner_id) as weekplan_num,(1.0*(count(a.owner_id))/trunc((to_date('2010-06-23','yyyy-mm-dd')-to_date('2000-01-01','yyyy-mm-dd'))*1.0/7)) as finish_rate
 ,
sum(case when a.status=1 then '已批' else '未批' end) as read_num,
((sum(case when a.status='已批' then 1
 else 0 end))*1.0/(count(a.owner_id))) as read_rate
 from ADS.new_plan a,ADS.province_dic  where
  a.ptype='周' and (1!=1  or (a.owner_area like '%北京%' and b.province_name='北京'))
   group by rollup(province_name,owner_name) order by province_name现在这里是按照一个省市的名称来统计的,但是我现在的需求是要扩展为省市和分社一起来统计,是否可以。
 情况紧急,希望高手多多指教。
 谢谢。

解决方案 »

  1.   

    group by rollup(province_name,owner_name,分社字段) 
      

  2.   

    直接这样就行吗,前面的case中不要考虑吗?
      

  3.   

    我想表达的意思是,在case中和省市一起进行判断
      

  4.   

    grouping(字段)代表在此行中此字段是否加入统计grouping()单独使用没有意义,所以没有什么grouping()的工作原理,有也是后面的group by rollup或者group by grouping sets()
    用个通俗的说法(不能直接这么写,列数对不上,需要自己补null,就是你前面的case做的事),
    group by rollup(a,b,c) =
       group by (a,b,c)  
       union group by (a,b) 
       union group by (a) 
       union group by () --这里写sql的时候是不写的,就是直接分成一组
    而group by grouping sets((a,b,c),(a,c),()) =
       group by (a,b,c)  
       union group by (a,c) 
       union group by () 可以自己定义你想分的组,更加灵活前面的case当然需要变,只不过是根据不同的grouping()值得到本行应该是总计/小计/合计