Для приложения для онлайн-заказа продуктов питания я определил, сколько ингредиентов нам нужно (которое мы называем StockItems ), но нам нужна помощь в преобразовании этого в то, что мы должны заказать, исходя из того, в какие размеры они входят.(который мы называем SupplierItems - т.е. StockItems + PackSizes).
Если мы возьмем яблоки в качестве примера, нам нужно заказать 46 (этот бит уже обработан).Но яблоки продаются только в коробках по 20 штук и по пять штук. Вы должны заказать яблоки в самых больших коробках, если это возможно, и затем переупорядочить, если не можете заказать точную сумму.Если вам нужно 46 яблок, вы закажете 2 коробки по 20 и 2 коробки по 5, что даст вам 50 яблок - лучшее, что вы получите с этими размерами упаковок.
SQL ниже создаетвсе необходимые таблицы и их заполнение будут данными.Таблица StockItemsRequired содержит 46 яблок, которые нам нужны.Я заполнил таблицу SupplierItemsRequired 2 полями по 20 и 2 по 5, но мне нужно разобраться с другими таблицами.
Мой вопрос:что такое SQL, чтобы заполнить таблицу SupplierItemsRequired правильными SupplierItems, которые необходимо заказать - в соответствии с приведенными выше правилами.Нет решений с курсорами или циклами, пожалуйста - я ищу решение на основе множеств (я уверен, что это можно сделать!).
Я использую SQL Server 2008.
-- create tables
create table StockItems (StockItemID int primary key identity(1,1), StockItemName varchar(50))
create table PackSizes (PackSizeID int primary key identity(1,1), PackSizeName varchar(50))
create table SupplierItems (SupplierItemID int primary key identity(1,1), StockItemID int, PackSizeID int)
create table StockItemsRequired(StockItemID int, Quantity int)
create table SupplierItemsRequired(SupplierItemID int, Quantity int)
-- fill tables
insert into StockItems (StockItemName) values ('Apples')
insert into StockItems (StockItemName) values ('Pears')
insert into StockItems (StockItemName) values ('Bananas')
insert into PackSizes (PackSizeName) values ('Each')
insert into PackSizes (PackSizeName) values ('Box of 20')
insert into PackSizes (PackSizeName) values ('Box of 5')
insert into SupplierItems (StockItemID, PackSizeID) values (1, 2)
insert into SupplierItems (StockItemID, PackSizeID) values (1, 3)
insert into StockItemsRequired (StockItemID, Quantity) values (1, 46)
insert into SupplierItemsRequired (SupplierItemID, Quantity) values (1, 2)
insert into SupplierItemsRequired (SupplierItemID, Quantity) values (2, 2)
-- SELECT definition data
select * from StockItems -- ingredients
select * from PackSizes -- sizes they come in
select si.SupplierItemID, st.StockItemName, p.PackSizeName -- how you buy these items
from SupplierItems si
inner join StockItems st on si.StockItemID = st.StockItemID
inner join PackSizes p on si.PackSizeID = p.PackSizeID
-- SELECT how many of the ingridients you need (StockItemsRequired)
select st.StockItemID, st.StockItemName, r.Quantity
from StockItemsRequired r
inner join StockItems st on r.StockItemID = st.StockItemID
-- SELECT how you need to buy these items (SupplierItemsRequired)
select si.SupplierItemID, st.StockItemName, p.PackSizeName, r.Quantity
from SupplierItemsRequired r
inner join SupplierItems si on r.SupplierItemID = si.SupplierItemID
inner join StockItems st on si.StockItemID = st.StockItemID
inner join PackSizes p on si.PackSizeID = p.PackSizeID