#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? Это проясняет?