欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

求大神赏赐一条sql

更新时间: 2014-01-05 02:14:29 责任编辑: Author_N1

 

求大神赐予一条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或者存储过程,谢谢了
大概这个意思


--参考方法--
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
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:14:29
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/7409/
本文WWW.DOC100.NET DOC100.NET版权所有。