在SQL中查找所有库存和库存日期

问题描述 投票:0回答:2

我有一个函数,它每天返回给定ItemCode的库存数量,例如:

ItemCode |库存日期|库存数量---------------------------------------产品1 | 2019-07-05 | 12产品1 | 2019-07-12 | 3产品1 | 2019-08-03 | 0产品1 | 2019-08-15 | 7产品1 | 2019-08-29 | 0产品1 | 2019-09-02 | 9

以及更多。

我需要找到InventoryQty为零,然后又有库存的日期。但是在任何时候。在此示例中:

ItemCode |缺货|库存缺货|存货-------------------------------------------------- ----------产品1 | 2019-08-03 | 2019-08-15 | 2019-08-29 | 2019-09-02

对于Product1,它返回2的InventoryQty等于零,但对于ProductX可能返回3或更多。

我需要您的帮助,如何编写选择条件?

sql sql-server tsql
2个回答
1
投票

您可以尝试这个

DECLARE @Inventor TABLE (ItemCode VARCHAR(10), InventoryDate DATE,  InventoryQty INT)
INSERT @Inventor VALUES
('Product1', '2019-07-05', 12),
('Product1', '2019-07-12', 3 ),
('Product1', '2019-08-03', 0 ),
('Product1', '2019-08-15', 7 ),
('Product1', '2019-08-29', 0 ),
('Product1', '2019-09-02', 9 )


SELECT StIn.ItemCode, StOut.InventoryDate StockOut , StIn.InventoryDate StockIn FROM @Inventor StOut   
    CROSS APPLY (SELECT TOP 1 * FROM @Inventor S WHERE StOut.ItemCode = S.ItemCode 
                    AND S.InventoryDate > StOut.InventoryDate
                    AND S.InventoryQty > 0
                 ORDER BY S.InventoryDate   
                    ) StIn   
WHERE StOut.InventoryQty = 0

结果:

ItemCode   StockOut   StockIn
---------- ---------- ----------
Product1   2019-08-03 2019-08-15
Product1   2019-08-29 2019-09-02

0
投票

在单独的行而不是在单独的列中返回值。我只用lag()

select t.*
from (select t.*,
             lag(InventoryQty) over (partition by ItemCode order by InventoryDate) as prev_InventoryQty
      from t
     ) t
where prev_InventoryQty = 0 or InventoryQty = 0;

您可以将每次停机将它们合并到一行中,但是如果连续有多个0,则您的问题没有指定要做什么。

© www.soinside.com 2019 - 2024. All rights reserved.