获取缺货但即将到来的产品的下一个可用日期
Posted
技术标签:
【中文标题】获取缺货但即将到来的产品的下一个可用日期【英文标题】:Get next available date for an out-of-stock, but incoming product 【发布时间】:2021-05-30 19:04:40 【问题描述】:我正在经营一家在线商店,该商店从外部 ERP 系统获取所有库存信息。我有一些需要延期交货的产品,我想在产品页面上显示下一个可用日期。
我可以访问 ERP 系统数据库和所有进货交货日期,单个产品的交货情况如下所示:
product | incoming_date | incoming |
---|---|---|
ABC123 | 20210607 | 34 |
ABC123 | 20210621 | 17 |
ABC123 | 20210705 | 34 |
ABC123 | 20210715 | 17 |
我还知道,对于这个特殊的产品,我有 59 件来自客户的延期交货(编号在同一个数据库中可用,我对此有控制权,因此它只是在以下查询中存储为变量 @Backorder(整数) )。我目前有 0 件库存。这意味着第一批和第二批货已经售出,下一个可用日期是 2021-07-05(第三行)。
过去几个小时我一直在摆弄这个问题,但我找不到好的解决方案。
我最接近的是这个:
DECLARE @Product AS VARCHAR(100)='ABC123';
DECLARE @Sold AS INT = 59;
SELECT row, product, incoming_date, incoming, available,
CASE WHEN available < 0 THEN 0 ELSE available-LAG(ABS(available),1) OVER (ORDER BY row) END AS new_available
FROM
(SELECT row, product, incoming_date, incoming,
CASE WHEN available < 0 THEN available ELSE incoming-ABS(LAG(available) OVER (ORDER BY row)) END AS available
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ArDt ASC) AS row, ProdNo AS product, ArDt AS incoming_date, SUM(NoInvoAb) AS incoming,
CASE WHEN ROW_NUMBER() OVER(ORDER BY ArDt ASC) = 1
THEN SUM(NoInvoAb)-@Sold ELSE 0 END AS available
FROM OrderLines WHERE TrTp = 6 AND NoInvoAb != 0 AND ProdNo = @Product GROUP BY ArDt, ProdNo
) AS A
) AS B
结果如下:
row | product | incoming_date | incoming | available | new_available |
---|---|---|---|---|---|
1 | ABC123 | 20210607 | 34.000000 | -25.000000 | 0.000000 |
2 | ABC123 | 20210621 | 17.000000 | -8.000000 | 0.000000 |
3 | ABC123 | 20210705 | 34.000000 | 34.000000 | 26.000000 |
4 | ABC123 | 20210715 | 17.000000 | 17.000000 | -17.000000 |
如您所见,它有点工作,但第四行和后面的行停止给出正确的结果。我必须一遍又一遍地循环“new_available”,这是……不可取的。
为调试目的显示完整结果。最后,我不需要表中的所有信息,只需要下一个可用日期,即。 2021-07-05 有 26 个单位可用。
这个问题有没有更好的解决方案?有什么更好的方法吗?
PS:必须在 SQL 查询本身中解决,在网上商店中计算它(目前)不是一种选择。
感谢所有回复和想法!
【问题讨论】:
【参考方案1】:我认为,在一天结束的时候,您只需要一个由已订购单位数量校正的累积总和。
您的查询令人困惑。它使用示例中未显示的列。下次请确保发布一致的[示例]。为了简化,我将使用下表:
CREATE TABLE elbat
(product varchar(6),
incoming_date date,
incoming integer);
INSERT INTO elbat
(product,
incoming_date,
incoming)
VALUES
('ABC123', '20210607', 34),
('ABC123', '20210621', 17),
('ABC123', '20210705', 34),
('ABC123', '20210715', 17);
要获取每个交货日期的可用商品数量,您可以使用以下查询,使用 sum()
窗口函数减去已订购的数量。
DECLARE @ordered integer = 59;
DECLARE @product varchar(6) = 'ABC123';
SELECT product,
incoming_date date,
CASE
WHEN sum(incoming) OVER (ORDER BY incoming_date) - @ordered < 0 THEN
0
ELSE
sum(incoming) OVER (ORDER BY incoming_date) - @ordered
END available
FROM elbat
WHERE product = @product;
如果您只对第二天可用性大于零感兴趣,您基本上可以将其放入派生表中并在当天使用min()
。
DECLARE @ordered integer = 59;
DECLARE @product varchar(6) = 'ABC123';
SELECT min(date)
FROM (SELECT incoming_date date,
sum(incoming) OVER (ORDER BY incoming_date) - @ordered available
FROM elbat
WHERE product = @product) x
WHERE available > 0;
db<>fiddle
【讨论】:
我可以看到令人困惑的地方。我在“第一个”派生查询中使用了别名,因此如果有意义的话,我可以使相同的查询适应不同的 ERP。以上是关于获取缺货但即将到来的产品的下一个可用日期的主要内容,如果未能解决你的问题,请参考以下文章
用 php 获取下一个第 15 天和/或第 30 天的日期?
Flutter 的下一步, Dart 3 重大变更即将在 2023 到来