Найти стоимость заказа (SQL или алгоритм выборки)
Существует три таблицы: STOCK, PRICE, ORDER
Две задачи:
- Найти стоимость заказа
- Найти ту же стоимость заказа, но уже с учётом запасов на складе
Во-первых, с таблицей в задании что-то явно не так, нет даже банального праймари key у продуктов, все продукты различать можно только по названиям, по тексту, а так же таблица с заказами странная от слова очень, во-вторых второй вопрос меня ставит немного в тупик, да и первый немножечко тоже, хотел бы услышать мнение от подкованных в этом людей.
Первая таблица STOCK содержит в себе полку, название продукта, количество (кг) и единицу измерения (кг либо литр)
Вторая PRICE содержит название продукта, цена за кг/литр, единица измерения кг/л
Третья ORDER содержит номер заказа (но это не праймари кий, больше похоже на внешний ключ, но при этом такая таблица отсутствует в данном задании), позиция (вообще не понимаю что это и к чему оно), название продукта, количество (25 кг помидоров допустим) и единица измерения опять же.
Далее покажу таблицу с заполненными данными, их там совсем чуть-чуть
Ответы (1 шт):
Примерно такой запрос должен устроить для начала:
select num,o.position,o.product,o.amount,o.measure,p.price
,o.amount*coalesce(p.price,0) sumpos
,s.amountTotal
,case when o.amount<=s.amountTotal then o.amount else s.amountTotal end amountfact
,case when o.amount<=s.amountTotal then o.amount else s.amountTotal end
*coalesce(p.price,0) sumposfact
from orders o
left join price p on p.product=o.product
left join (select product,measure,sum(amount)amountTotal from stock group by product,measure) s
on s.product=o.product and s.measure=o.measure
Думаю, единица измерения в Price и Stock имеет значение, т.к. продукт может быть в разной фасовке и у него может быть разная цена. Поэтому нужно добавить дополнительное условие в соединение stock.measure=orders.measure.
В примере наименование таблицы order поменял на orders, чтобы не путаться с ключевым словом SQL.
Результат запроса на приведенных данных
| num | position | product | amount | measure | price | sumpos | amounttotal | amountfact | sumposfact |
|---|---|---|---|---|---|---|---|---|---|
| 79586 | 10 | Перцы | 23 | кг | 150 | 3450 | 15 | 15 | 2250 |
| 79586 | 20 | Капуста | 20 | кг | 200 | 4000 | 18 | 18 | 3600 |
Похоже, это перевод товаросопроводительных документов с Excel на СУБД. Многие вещи, лего и удобно реализуемые в Excel, покажется странным в реализации в СУБД, но это удобство для пользователя ценно.
