Из таблицы запасов найдите дату между двумя датами, когда акции были нулевыми - PullRequest
3 голосов
/ 21 мая 2019

У меня есть таблица SQL https://pasteboard.co/IfFt5rF.png, в которой тысячи записей о потоках продуктов, количество является отрицательным, если продукт был продан, и положительным при его покупке.product_id является уникальным идентификатором для каждого продукта.Я хочу ввести даты и выяснить для каждого месяца между этой датой, когда это было, когда запас был нулевым.

Сначала я думал о начальном балансе для каждого месяца, просто выясняя сумму прошлых периодов, а затем добавляя новые строки за строкой, и если он получает ноль, то это дата, но эта логика кажется супер ужасной идаже не знаю, как справиться с этим в SQL.

Я использую Microsoft SQL 2014

declare @Table table (general_id bigint, date datetime, product_id bigint, quantity float, 
price float, code nvarchar(max), name nvarchar(max), partnumber nvarchar(max), 
description nvarchar(max), rate float, comment nvarchar(max), currency nvarchar(max), waybill nvarchar(max))

insert into @Table (general_id, date, product_id, quantity, price, code, name, partnumber, description, rate, comment, currency, waybill)
  select 1, '2019-03-1 16:33:00', 1, 10, 100, 101010, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 2, '2019-03-2 16:33:09', 1, -5, 100, 101010, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 3, '2019-03-3 16:33:12', 1, -3, 100, 101010, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 4, '2019-03-4 16:39:00', 1, -2, 100, 101010, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 5, '2019-03-4 16:39:41', 2, 40, 100, 102020, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 6, '2019-03-5 16:39:00', 2, -40, 100, 202020, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'
  union all
  select 7, '2019-03-6 16:39:00', 1, 25, 100, 101010, 'test', 'testnumber', 'testdescription', 1.0, 'testcomment', 'USD', 'nobill'


SELECT DISTINCT product_id, code, name, partnumber, SUM(quantity) 
FROM @TABLE
GROUP BY product_id, code, name, partnumber 
ORDER BY product_id ASC                                 

Если ввод будет в диапазоне дат от 2019-03-01 до 2019-03-31, товыход для текущего случая будет.product_id: 1 out_of_Stock_date: 2019-03-4 zero_stock_days: 2 потому что на 2019-03-6 товар был куплен и уже есть в наличии

product_id: 2 out_of_stock_date: 2019-03-5 zero_stock_days: 26 потому что никогда не былокупил снова

1 Ответ

1 голос
/ 21 мая 2019

Попробуйте этот запрос, используя оконные функции, доступные в Sql Server> 2008:)

SELECT [lagDate] outOfStockStart,
       [date] outOfStockEnd, 
       product_id, 
       daysOutOfStock
FROM (
    SELECT *, 
           CASE WHEN LAG(stock) OVER (PARTITION BY product_id ORDER BY [date]) = 0 AND stock > 0 THEN
             DATEDIFF(day, lagDate, [date]) ELSE NULL END daysOutOfStock
    FROM (
        SELECT [date],
               LAG([date]) OVER (PARTITION BY product_id ORDER BY [date]) lagDate,
               product_id,
               SUM(quantity) over (PARTITION BY product_id ORDER BY [date]) stock
        FROM @TABLE
    ) a
) a WHERE daysOutOfStock IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...