【问题标题】: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 查询本身中解决,在网上商店中计算它(目前)不是一种选择。

感谢所有回复和想法!

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多