日期:2014-05-17  浏览次数:20915 次

求大神赐予一条SQL
在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

------解决方案--------------------
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.* ,ro