Проверка количеств на будущие даты и возврат сокращений

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть две таблицы Инвентаризации и заказов в SQL Server.

Допустим, запасы отражают текущие и будущие запасы для всех размещенных заказов.

Инвентаризация

 Item       Quantity
Shoes      100 
Coats      200
Socks      -300
  

В этом случае компании не хватает 300 носков на основе таблицы.

Заказы отражают как товары, которые мы покупаем у производителей, так и товары, которые мы продаем.

 Item      Quantity      Ship_ArrivalDate      Buy_Sell
Shoes     300           10/27/2016            Sell
Socks     500           10/27/2016            Buy
Socks     500           10/29/2016            Sell
Shoes     800           10/30/2016            Buy
  

Итак, если сегодня 24.10.2016, у меня на самом деле сегодня 0 shoes. У меня есть 200 носков на 27.10.2016, а затем будет недостача 300 носков 29.10.2016, потому что инвентарь отражает все будущие транзакции. И после продажи 300 и покупки 800 единиц обуви у меня на складе остается 100. Но это означает, что 27.10.2016 у меня будет нехватка обуви.

Я хочу создать таблицу, которая отражает все будущие даты и проверяет дни, в которые у меня будет мало.

Таким образом, таблица в конечном итоге будет выглядеть следующим образом:

Вывод

 Date         Item        Quantity_Short
10/27/2016   Shoes       -400
10/29/2016   Socks       -300
  

Я запутался в том, как проверять каждую дату, и действительно не знаю, с чего начать. Я понимаю, как проверить 1 дату изолированно, но как вы по существу «перебираете» все будущие даты и сохраняете даты и количества в выходной таблице?

Может быть, написать функцию, которая принимает дату, и применяется ли математика, которую затем используют?

Приветствуется любой начальный совет. Спасибо!

Комментарии:

1. Какая у вас версия ms sql?

2. SQL Server Management Studio 2008

Ответ №1:

Вы можете попробовать что-то вроде этого

 select date, item,
       sum(case when date > getdate() and buy_sell = 'sell' then -Quantity
                else Quantity
           End) as SumQuantity
from YourTable
group by date, item
  

Комментарии:

1. @jarlh Еще раз благодарю вас за решение. Я реализовал это немного раньше, но у меня есть случай, когда единственные даты, которые отображаются в выходных данных, — это те, с которыми были связаны ship_arrivalDates. Есть ли хороший способ показать все даты в пределах диапазона? Допустим, я хочу с 27.10 по 30.10 включительно, даже если покупка или продажа не были выполнены.

2. Вы можете использовать даты > 27.10 и <=10/30 (с указанием времени окончания) в случае. Однако я не совсем понял ваш вопрос. Я не большой поклонник использования date между startdate и enddate, в этом есть сложности.

3. Спасибо за ответ. Чтобы прояснить вопрос, извините, мой пример не идеален для этой надстройки, но, скажем, я хочу, чтобы моя выходная таблица возвращала количества 27.10, 28.10, 29.10, 30.10 независимо от того, являются ли они недостающими запасами или нет. Но у меня есть изменения в запасах, скажем, для обуви, только 27.10 и 30.10 в таблице заказов. Как мне вернуть все уровни запасов 27.10, 28.10, 29.10, 30.10? Это проясняет?