【发布时间】: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