在oracle数据库中DYEARMONTH PK_CORP CWAREHOUSEID CCALBODYID CINVENTORYID SUM(DATEIN_NUM) SUM(QIMO_NUM)
2012-01 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 0
2012-02 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 0
2012-03 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 0
2012-04 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 100 70
2012-05 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 45
2012-06 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 35
2012-07 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 100 107
2012-08 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 104
2012-09 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 67
2012-10 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 40
2012-11 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 0 23
2012-12 1002 1002F8100000000003ZA 1002F81000000000002T 0001A210000000008K16 100 114有数据是这样
现在通过出来的数据的最后一个SUM(QIMO_NUM)来进行判断,如上面的数据,即是114
判断的顺序必须从下往上,即从12月开始判断
当114>12月的SUM(DATEIN_NUM)时,即114>100,则12月的值是100,并将114-100=14作为下面判断
接着进行11月判断,14>0,则11月的值是0,并将14-0-14作为下面判断
到7月的时候14<7月的SUM(DATEIN_NUM),即14<100,则7月等于14,当出现这个情况的时候,后面的月份无需在进行判断,直接取0则最后出的结果是:
12月 100
11月 0
10月 0
9月 0
8月 0
7月 14
6月 0
现在假色 12月的SUM(QIMO_NUM)不是114,是250的话
那么出来的结果就是
12月 100
11月 0
10月 0
9月 0
8月 0
7月 100
6月 0
5月 0
4月 50
3月 0
2月 0
1月 0

求大神赐予一条SQL或者存储过程,谢谢了
大概这个意思数据库oracle

解决方案 »

  1.   

    with t as (
    select '2012-01' mon, 0 val,23 val2 from dual union all
    select '2012-02' mon, 0 val,63 val2 from dual union all
    select '2012-03' mon, 0 val,12 val2 from dual union all
    select '2012-04' mon, 100 val,46 val2 from dual union all
    select '2012-05' mon, 0 val,23 val2 from dual union all
    select '2012-06' mon, 0 val,44 val2 from dual union all
    select '2012-07' mon, 100 val,3 val2 from dual union all
    select '2012-08' mon, 0 val,34 val2 from dual union all
    select '2012-09' mon, 0 val,4 val2 from dual union all
    select '2012-10' mon, 0 val,23 val2 from dual union all
    select '2012-11' mon, 0 val,546 val2 from dual union all
    select '2012-12' mon, 100 val,250 val2 from dual
    ),t1 as (
    select t.* from t order by 1 desc
    ),t2 as (
    select t1.* ,rownum rn from t1
    ),t3 as (
    select tt.*
           ,(select val2 from t2 where rn=1)-(select sum(val)  from t2 where rn<=tt.rn) diff
    from t2 tt
    )
    select 
         to_char(to_date(mon,'YYYY-MM'),'Month') 月
         ,case when diff>=0 then val when val+diff>=0 then val+diff else 0 end rst
    from t3