Найти все даты входа и выхода в SQL - PullRequest
0 голосов
/ 18 октября 2019

У меня есть функция, которая возвращает Inventory Qty изо дня в день для данного ItemCode, например:

ItemCode | InventoryDate | InventoryQty
---------------------------------------
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

и более.

Мне нужно найти даты, когда InventoryQty равен нулю, изатем, когда снова в наличии. Но во все времена. В этом примере:

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

Для Product1 он возвращает 2 раза, InventoryQty равен нулю, но для ProductX может возвращать 3 или более.

Мне нужна ваша помощь, как написать условие выбора

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы можете попробовать это

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 голосов
/ 18 октября 2019

Возвращает значения в отдельных строках, а не в отдельных столбцах. Я бы просто использовал 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;

Вы можете объединить их в одну строку для каждого простоя - но ваш вопрос не указывает, что делать, если вгрести.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...