想了很久,都不知道怎么开始写,求各位老大帮助。我现在有一个表,如表一,
里面储存的是每年物料每周的需求数量,从第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存储过程
里面储存的是每年物料每周的需求数量,从第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存储过程
解决方案 »
- case when 当中如何判断一个字段是否为空
- 如何实现这样的搜索?
- [小问题]group by 问题
- 哪位sql server高手可以帮个忙,解决一个问题,急急急!!!!
- BCP将数据保存在另一部机子有问题,斑竹帮忙啊
- 外联接问题,急!
- 关于多表链接的删除~~~~~~~~~~~~~求解~~~~~~~不知道帮顶~ 谢谢·~
- SELECT IN的问题
- 我的毕业论文<基于sql server的分布式数据库的设计与开发>,怎么弄啊,帮帮忙!!!
- 一个外键的问题,实在没法了//sql server7.0
- 拆分字符串后的模糊查询
- 自己Telnet自己的1433端口可行,但别人的telnet我的1433端口就不行。怎么解决?
http://bbs.csdn.net/topics/390431456
go
create table [TB1] (WEEK int,ItemID int,Qty int)
insert into [TB1]
select 201300,1001,500 union all
select 201311,1001,300 union all
select 201312,1001,300 union all
select 201313,1001,500 union all
select 201314,1001,0 union all
select 201300,1002,0 union all
select 201311,1002,300 union all
select 201312,1002,90select * from [TB1]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
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, ORDER BY week ) AS num
FROM T1)
SELECT week,itemid,CASE WHEN sqty <0 AND num =1 THEN ABS(sqty) ELSE ABS(qty) END AS qty
FROM T2
/*
week itemid qty
201300 1001 500
201311 1001 300
201312 1001 100
201313 1001 500
201314 1001 0
201300 1002 0
201311 1002 300
201312 1002 90*/
测试了一下,还有一些小问题,比如下列:
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 -214
19 10-03-091MT27 -188
20 10-03-091MT27 -80
21 10-03-091MT27 -105
查询结果为:
week itemid qty
00 10-03-091MT27 94
13 10-03-091MT27 66 这里应该是0
14 10-03-091MT27 88 这里应该是 60
16 10-03-091MT27 58
17 10-03-091MT27 214
19 10-03-091MT27 188
20 10-03-091MT27 80
21 10-03-091MT27 105这应该是哪里没注意到,请指出。谢谢。
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
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, ORDER BY week ) AS num
FROM T1)SELECT week ,
itemid ,
CASE WHEN EXISTS ( SELECT 1 --这个地方加个判断即可
FROM T2
WHERE sqty < 0 )
THEN CASE WHEN sqty < 0
AND num = 1 THEN ABS(sqty)
ELSE ABS(qty)
END
ELSE CASE WHEN num = 1 THEN ABS(qty)
ELSE 0
END
END AS qty
FROM T2