有这样一个表(table1),里面的记录如下
xmmc        kssj               jssj         dliang
项目1     2007-01-01        2007-03-31       300
项目2     2007-02-01        2007-05-31      1000
我现在要上面的记录按月份分解,将这个时间范围内的总的电量按月平均,也就是说这个时间段内有多少个月,那我下面这个表的平均电量(yuedliang)就为这个时间段的总电量除于算出来的月的数量,结果如下:
xmmc        kssj               jssj          yuefen          yuedliang
项目1     2007-01-01        2007-07-31      2007-01             100
项目1     2007-01-01        2007-07-31      2007-02             100
项目1     2007-01-01        2007-07-31      2007-03             100
项目2     2007-02-01        2007-05-31      2007-02             200
项目2     2007-02-01        2007-05-31      2007-03             200
项目2     2007-02-01        2007-05-31      2007-04             200
项目2     2007-02-01        2007-05-31      2007-05             200
不知道用sql语句能否实现,不行写个存储过程也ok,多谢了,在线等!

解决方案 »

  1.   

    我测试是可以的,你试试看~~~========================第一种========================SQL>  select tt.xmmc,
      2             add_months(tt.kssj,rr-1) as kssj,
      3             decode(sign(add_months(tt.kssj,rr)-tt.jssj),1,tt.jssj,add_months(tt.kssj,rr)) as jssj,
      4             round(tt.dliang/(to_number(months_between(tt.jssj+1,tt.kssj)))) as avg_dliang
      5     from (
      6            select '项目1' as xmmc,to_date('2007-01-01','yyyy-mm-dd') as kssj,to_date('2007-03-31','yyyy-mm-dd') as jssj,300 as dliang from dual
      7            union all
      8            select '项目2' as xmmc,to_date('2007-02-01','yyyy-mm-dd') as kssj,to_date('2007-05-31','yyyy-mm-dd') as jssj,1000 as dliang from dual
      9          )tt,
     10          (
     11            select rownum rr from all_objects where rownum<1000
     12          )
     13     where add_months(tt.kssj,rr)-(tt.jssj+1)<=0;XMMC      KSSJ        JSSJ        AVG_DLIANG
    --------- ----------- ----------- ----------
    项目1     1/1/2007    2/1/2007           100
    项目1     2/1/2007    3/1/2007           100
    项目1     3/1/2007    3/31/2007          100
    项目2     2/1/2007    3/1/2007           250
    项目2     3/1/2007    4/1/2007           250
    项目2     4/1/2007    5/1/2007           250
    项目2     5/1/2007    5/31/2007          2507 rows selected
    ==========================第二种==================SQL>  select tt.xmmc,
      2             tt.kssj,
      3             tt.jssj,
      4             to_char(decode(sign(add_months(tt.kssj,rr)-tt.jssj),1,tt.jssj,add_months(tt.kssj,rr-1)),'yyyy-mm') as jssj,
      5             round(tt.dliang/(to_number(months_between(tt.jssj+1,tt.kssj)))) as avg_dliang
      6     from (
      7            select '项目1' as xmmc,to_date('2007-01-01','yyyy-mm-dd') as kssj,to_date('2007-03-31','yyyy-mm-dd') as jssj,300 as dliang from dual
      8            union all
      9            select '项目2' as xmmc,to_date('2007-02-01','yyyy-mm-dd') as kssj,to_date('2007-05-31','yyyy-mm-dd') as jssj,1000 as dliang from dual
     10          )tt,
     11          (
     12            select rownum rr from all_objects where rownum<1000
     13          )
     14     where add_months(tt.kssj,rr)-(tt.jssj+1)<=0;XMMC      KSSJ        JSSJ        JSSJ    AVG_DLIANG
    --------- ----------- ----------- ------- ----------
    项目1     1/1/2007    3/31/2007   2007-01        100
    项目1     1/1/2007    3/31/2007   2007-02        100
    项目1     1/1/2007    3/31/2007   2007-03        100
    项目2     2/1/2007    5/31/2007   2007-02        250
    项目2     2/1/2007    5/31/2007   2007-03        250
    项目2     2/1/2007    5/31/2007   2007-04        250
    项目2     2/1/2007    5/31/2007   2007-05        2507 rows selected
      

  2.   

    mantisXF(枫の叶) ,多谢老兄了!