减少等于或小于零时改变另一个值的累积和

Decreasing Cumulative Sum That When Equal to or Less Than Zero Change Another Value

下面我们有两个表,一个是采购订单,另一个是销售订单。我想做的是将每个销售订单分配给一个采购订单,并提供免费库存。我可以使用以下查询来完成:

Table 1 - 收到的采购订单:

number item shipDate qty usedQty freeQty
12 Toy 2021-11-20 100 95 5
22 Toy 2021-11-24 230 190 40
23 Toy 2021-11-27 145 140 140
34 Toy 2021-12-20 400 400 400

Table 2 - 销售订单:

number item createDate qtyNeeded allocateToPoNum
1234 Toy 2021-06-03 3
2345 Toy 2021-08-09 2
3456 Toy 2021-08-26 30
4567 Toy 2021-08-31 6
4574 Toy 2021-09-02 4
5685 Toy 2021-10-13 100
SELECT 
    a.number,
    a.item,
    a.createDate,
    a.qtyNeeded,
    (SELECT TOP 1 x.number FROM purchaseOrders x WHERE a.item = x.item ORDER BY x.createDate, x.number) as 'allocateToPoNum'
FROM salesOrder a
ORDER BY a.createDate

这 return 如下:

number item createDate qtyNeeded allocateToPoNum
1234 Toy 2021-06-03 3 12
2345 Toy 2021-08-09 2 12
3456 Toy 2021-08-26 30 12
4567 Toy 2021-08-31 6 12
4574 Toy 2021-09-02 4 12
5685 Toy 2021-10-13 100 12

我遇到但似乎想不出解决方案的问题是,查询只会 return 列表中的第一个采购订单,但到第三行,所有免费数量该采购订单已用完。

购买 12 有 5 个免费数量。销售订单 1234 和 2345 总共需要 5 个数量。他们都应该有一个 allocateToPoNum = 12.

销售订单 3456、4567 和 4574 总共需要 40 个,它们不能分配给采购订单 12,因为前面的行已经用完了。所以应该有一个 allocateToPoNum = 22

我想要发生的是,一旦所选采购订单的所有免费数量用完,查询应使用下一个有免费库存的采购订单,依此类推。所以查询的输出应该是这样的:

number item createDate qtyNeeded allocateToPoNum
1234 Toy 2021-06-03 3 12
2345 Toy 2021-08-09 2 12
3456 Toy 2021-08-26 30 22
4567 Toy 2021-08-31 6 22
4574 Toy 2021-09-02 4 22
5685 Toy 2021-10-13 100 23

任何有关如何解决此问题的想法都将不胜感激。我已尽力做到尽可能详细,但我遗漏了任何内容,请告诉我。

谢谢。

这似乎适用于您的数据。我只是在每个 table 中添加了一列来计算先前的总和以使事情变得更容易:

declare @incomingPO table (
number int,
item varchar(20),
shipDate date,
qty int,
priorQty int)
insert into @incomingPO select 12, 'toy', '2021-11-20', 5,0
insert into @incomingPO select 22, 'toy', '2021-11-24', 40,0
insert into @incomingPO select 23, 'toy', '2021-11-27', 140,0
insert into @incomingPO select 34, 'toy', '2021-12-20', 400,0
update @incomingPO set priorQty = (select sum(qty) from @incomingPO s where s.number <= po.number) from @incomingPO po

select * from @incomingPO

    declare @salesOrders table (
    number int,
    item varchar(20),
    createDate date,
    qtyNeeded int,
    priorUsedQty int
    )
insert into @salesOrders select 1234, 'Toy', '2021-06-03', 3, 0
insert into @salesOrders select 2345, 'Toy', '2021-08-09', 2, 0
insert into @salesOrders select 3456, 'Toy', '2021-08-26', 30, 0
insert into @salesOrders select 4567, 'Toy', '2021-08-31', 6, 0
insert into @salesOrders select 4574, 'Toy', '2021-09-02', 4, 0
insert into @salesOrders select 5685, 'Toy', '2021-10-13', 100, 0

update @salesOrders SET priorUsedQty = (select sum(qtyNeeded) FROM @salesOrders s where s.number <= so.number) from @salesOrders so
select  
so.*,
(select top 1 number from @incomingPO po where so.priorUsedQty <= po.priorQty ) as [allocateToPoNum]
from @salesOrders so

输出一个 table,其中分配给销售订单的采购订单编号递增: