高手帮忙看段SQL,取前20名问题
这个报表是“损失率较小的前20名”,另外,所取的表的数据量现在大概有10W行报表的结构是这样的
id   本月供电量 本月售电量 上月供电量 上月售电量表结构是这样的
  id
   gdl 供电量
  sdl 售电量
  rq  日期(格式为200808)我写到如下就不知道该怎么往下写了,假设统计的日期为200808
select 
id,
sum(decode(rq,200808,gdl,0)) 本月供,
sum(decode(rq,200808,sdl,0)) 本月售,
sum(decode(rq,200807,gdl,0)) 上月供,    --这里图简单直接写出了200807,实际是用了add_months
sum(decode(rq,200807,sdl,0)) 上月售
from table
group by id
下面不知道怎么排序了,损失率=(供-售)/供, 按本月的排序。取前20名

解决方案 »

  1.   


    select *
    from(
    select 
    id, 
    sum(decode(rq,200808,gdl,0)) 本月供, 
    sum(decode(rq,200808,sdl,0)) 本月售, 
    sum(decode(rq,200807,gdl,0)) 上月供,    
    sum(decode(rq,200807,sdl,0)) 上月售,round((sum(decode(rq,200808,gdl,0)) -sum(decode(rq,200808,sdl,0)) )/sum(decode(rq,200808,gdl,0)),4) loss_rate 
    from table 
    group by id 
    order by 6 desc
    )
    where rownum<=20
      

  2.   

    select id,
           a.gdl 本月供电量,
           a.sdl 本月售电量,
           b.gdl 上月供电量,
           b.sdl 上月售电量 
      from (select id, rq, gdl, sdl from tablename) a,
           (select id, rq, gdl, sdl from tablename) b
     where a.id = b.id
       and add_months(to_date(b.rq, 'yyyymm'), 1) = to_date(a.rq, 'yyyymm');