I have a loop query with scenario below:
- orderqty = increase value 1 each loop
- runningstock = decrease value 1 each loop
- allocateqty = case when orderqty > 0 and runningstock > 0 then 1 else 0
- loop till runningstock=0 or total allocation=stockqty
Query:
x
DECLARE @RESULT TABLE (priority int,partcode nvarchar(50),orderqty int, runningstock int, allocateqty int)
DECLARE @ORDER TABLE(priority int,partcode nvarchar(50),orderqty int)
DECLARE @STOCK TABLE(partcode nvarchar(50),stockqty int)
INSERT INTO @ORDER (priority,partcode,orderqty)
VALUES(1,'A',2),
(2,'A',10),
(3,'A',3),
(4,'A',8);
INSERT INTO @STOCK(partcode,stockqty)
VALUES('A',20);
DECLARE @allocateqty int=1
DECLARE @runningstock int=(SELECT stockqty FROM @stock)
WHILE @runningstock>=0
BEGIN
INSERT INTO @RESULT(priority,partcode,orderqty,runningstock,allocateqty)
SELECT priority,
partcode,
orderqty,
@runningstock,
CASE WHEN @runningstock > 0 AND orderqty > 0 THEN 1 ELSE 0 END
FROM @order
SET @runningstock -=1
END
SELECT * FROM @Result
GO
Result:
priority partcode orderqty runningstock allocateqty
1 A 2 20 1
2 A 10 20 1
3 A 3 20 1
4 A 8 20 1
1 A 2 19 1
2 A 10 19 1
3 A 3 19 1
4 A 8 19 1
1 A 2 18 1
2 A 10 18 1
3 A 3 18 1
4 A 8 18 1
1 A 2 17 1
2 A 10 17 1
3 A 3 17 1
4 A 8 17 1
1 A 2 16 1
2 A 10 16 1
3 A 3 16 1
4 A 8 16 1
1 A 2 15 1
2 A 10 15 1
3 A 3 15 1
4 A 8 15 1
1 A 2 14 1
2 A 10 14 1
3 A 3 14 1
4 A 8 14 1
1 A 2 13 1
2 A 10 13 1
3 A 3 13 1
4 A 8 13 1
1 A 2 12 1
2 A 10 12 1
3 A 3 12 1
4 A 8 12 1
1 A 2 11 1
2 A 10 11 1
3 A 3 11 1
4 A 8 11 1
1 A 2 10 1
2 A 10 10 1
3 A 3 10 1
4 A 8 10 1
1 A 2 9 1
2 A 10 9 1
3 A 3 9 1
4 A 8 9 1
1 A 2 8 1
2 A 10 8 1
3 A 3 8 1
4 A 8 8 1
1 A 2 7 1
2 A 10 7 1
3 A 3 7 1
4 A 8 7 1
1 A 2 6 1
2 A 10 6 1
3 A 3 6 1
4 A 8 6 1
1 A 2 5 1
2 A 10 5 1
3 A 3 5 1
4 A 8 5 1
1 A 2 4 1
2 A 10 4 1
3 A 3 4 1
4 A 8 4 1
1 A 2 3 1
2 A 10 3 1
3 A 3 3 1
4 A 8 3 1
1 A 2 2 1
2 A 10 2 1
3 A 3 2 1
4 A 8 2 1
1 A 2 1 1
2 A 10 1 1
3 A 3 1 1
4 A 8 1 1
1 A 2 0 0
2 A 10 0 0
3 A 3 0 0
4 A 8 0 0
the correct one should be like this:
priority partcode orderqty runningstock allocateqty
1 A 2 20 1
2 A 10 19 1
3 A 3 18 1
4 A 8 17 1
1 A 1 16 1
2 A 9 15 1
3 A 2 14 1
4 A 7 13 1
1 A 0 12 0
2 A 8 12 1
3 A 1 11 1
4 A 6 10 1
1 A 0 9 0
2 A 7 9 1
3 A 0 8 0
4 A 5 8 1
1 A 0 7 0
2 A 6 7 1
3 A 0 6 0
4 A 4 6 1
1 A 0 5 0
2 A 5 5 1
3 A 0 4 0
4 A 3 4 1
1 A 0 3 0
2 A 4 3 1
3 A 0 2 0
4 A 2 2 1
1 A 0 1 0
2 A 3 1 1
3 A 0 0 0
Advertisement
Answer
You can also loop through your priorities and make sure the orderqty is updated accordingly. I’d do something like this:
DECLARE @allocatedqty int = 0
DECLARE @allocateqty int = 1
DECLARE @runningstock int = (SELECT stockqty FROM @stock)
WHILE @runningstock>=0
BEGIN
DECLARE @priority int
SELECT TOP 1 @priority = priority FROM @order ORDER BY priority ASC
WHILE @priority <= (SELECT MAX(priority) FROM @order)
BEGIN
DECLARE @orderqty int
SELECT @orderqty = orderqty - @allocatedqty FROM @order WHERE priority = @priority
SELECT @allocateqty = CASE WHEN @runningstock > 0 AND @orderqty > 0 THEN 1 ELSE 0 END
INSERT INTO @RESULT(priority,partcode,orderqty,runningstock,allocateqty)
SELECT @priority,
partcode,
CASE WHEN @orderqty >= 0 THEN @orderqty ELSE 0 END AS orderqty,
@runningstock,
@allocateqty
FROM @order
WHERE priority = @priority
SET @priority += 1
SET @runningstock = @runningstock - @allocateqty
END
SET @allocatedqty += 1
IF (@runningstock <= 0) BREAK
END
SELECT * FROM @Result
GO