我有一个函数,它每天返回给定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或更多。
我需要您的帮助,如何编写选择条件?
您可以尝试这个
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
在单独的行而不是在单独的列中返回值。我只用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
,则您的问题没有指定要做什么。