减少等于或小于零时改变另一个值的累积和
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,其中分配给销售订单的采购订单编号递增:
下面我们有两个表,一个是采购订单,另一个是销售订单。我想做的是将每个销售订单分配给一个采购订单,并提供免费库存。我可以使用以下查询来完成:
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,其中分配给销售订单的采购订单编号递增: