【发布时间】: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 查询本身中解决,在网上商店中计算它(目前)不是一种选择。
感谢所有回复和想法!
【问题讨论】:
标签: sql sql-server tsql