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

求SQL语句(在线等)
想了很久,都不知道怎么开始写,求各位老大帮助。

我现在有一个表,如表一,
里面储存的是每年物料每周的需求数量,从第1周至52周
第0周,储存的是目前仓库的库存量。

我现在想得到表二,

w0(现有量)- 最早一次需求(201311 13年11周 ),如果大于0,这这周就等于0(不需再购,有库存)
然后继续下一周
W0-W11-W12(500-300-300),这时-100,表明这一周需要购100,因此这里显示100。
之后就不需要再减,直接取表一中的需求数量。

如果现W0等于负数,那需要把这个需求和算在第一个需求上。
(如W0=-19,W11 100 ,那么W11=19+100 =119,之后的周就直接取表一的需求)

表一:
WEEK       ItemID   Qty
201300     1001     500
201311     1001     300
201312     1001     300
201313     1001     500
201314     1001     0
……
201352     1001     

201300     1002     0
201311     1002     300
201312     1002     90
……


表二:
WEEK       ItemID   Qty
201311     1001     0  (500-300)>0
201312     1001     100  (500-300-300)=abs(-100)
201313     1001     500  (如果上一个结果小于0,从这行开始就等于表一值)
201314     1001     0
……
201352     1001     

201300     1002     0
201311     1002     300
201312     1002     90
……





递归 SQL 存储过程

------解决方案--------------------
哥们 咱俩的问题好像有点类似啊 
http://bbs.csdn.net/topics/390431456
------解决方案--------------------
引用:
您好,OrchidCat。我将您的语句移到生产环境后,
测试了一下,还有一些小问题,比如下列:
WEEK     ITEMID          QTY
00 10-03-091MT27 94
13 10-03-091MT27 -66
14 10-03-091MT27 -116
16 10-03-091MT27 -58
17 10-03-091MT27 -2……



;WITH TT
AS
(SELECT WEEK,itemid,CASE WHEN RIGHT(CONVERT(VARCHAR,week),2) = '00' THEN qty ELSE - qty END AS qty 
FROM tb1),
 
T1
AS(
SELECT TOP 100 A.week,a.itemid,a.qty,CASE WHEN SUM(b.qty) > 0 THEN 0 ELSE SUM(b.qty) END AS sqty,
CASE WHEN SUM(b.qty)<0 THEN 1 ELSE 0 END AS mark
FROM TT A
INNER JOIN TT B ON A.itemid = B.itemid AND A.[week] >= b.[week]
GROUP BY A.week,a.itemid,a.qty
ORDER BY a.itemid,a.week
),
 
T2
AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY itemid,mark ORDER BY week ) AS num
FROM  T1)

SELECT  week ,