【问题标题】:Decreasing Cumulative Sum That When Equal to or Less Than Zero Change Another Value减少等于或小于零时改变另一个值的累积和
【发布时间】:2021-12-28 19:50:33
【问题描述】:

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

表 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

表 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

这将返回以下内容:

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

我遇到并且似乎无法想到解决方案的问题是查询只会返回列表中的第一个采购订单,但到第三行,该采购订单的所有免费数量都已用完.

购买 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

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

谢谢。

【问题讨论】:

  • 那么当您需要将销售分配给多个 PO 时会发生什么?例如,如果 2345 也是 3,则需要 PO 12 中的 2 和 PO 22 中的 1,只剩下 39 空闲等...?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多