sql - 获取缺货但即将到来的产品的下一个可用日期
问题描述
我正在经营一家从外部 ERP 系统获取所有库存信息的在线商店。我有一些延期交货的产品,我想在产品页面上显示下一个可用日期。
我可以访问 ERP 系统数据库和所有进货交货日期,单个产品的交货情况如下所示:
产品 | 传入日期 | 传入 |
---|---|---|
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
结果是:
排 | 产品 | 传入日期 | 传入 | 可用的 | 新的可用 |
---|---|---|---|---|---|
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 查询本身中解决,在网上商店中计算它(目前)不是一个选项。
所有的回应和想法表示赞赏!
解决方案
我认为,归根结底,您只需要通过已订购单位的数量校正的累积总和。
您的查询令人困惑。它使用示例中未显示的列。下次请确保发布一致的[示例]。为了简化事情,我将使用下表:
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;
推荐阅读
- html - 在 CSS 中动态格式化样式
- sql - 使用数据样式 NULL 转换为 int
- memory-management - 在 Linux、windows 和 OX 中绕过内存管理系统
- java - 在 CodeDeploy 中访问 CodeBuild 运行时
- python - 有没有办法将会话从 python 传输到浏览器?
- javascript - 获取错误在控制台中提供了比在 catch 方法中更多的错误信息
- javascript - 使用钩子(setState,useEffect)从屏幕中提取重复代码的最佳方法?
- scala - 通过 slick codegen 导入从另一个项目构建的依赖项时,“对象不是包的成员”
- python - 如何在 pytest 会话结束时清理资源?
- sql - 为什么我的 WHERE 子句会影响我的 LEFT JOIN?