Найти стоимость заказа (SQL или алгоритм выборки)

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2023

Существует три таблицы: STOCK, PRICE, ORDER

Две задачи:

  1. Найти стоимость заказа
  2. Найти ту же стоимость заказа, но уже с учётом запасов на складе

Во-первых, с таблицей в задании что-то явно не так, нет даже банального праймари key у продуктов, все продукты различать можно только по названиям, по тексту, а так же таблица с заказами странная от слова очень, во-вторых второй вопрос меня ставит немного в тупик, да и первый немножечко тоже, хотел бы услышать мнение от подкованных в этом людей.Структура БД Первая таблица STOCK содержит в себе полку, название продукта, количество (кг) и единицу измерения (кг либо литр) Вторая PRICE содержит название продукта, цена за кг/литр, единица измерения кг/л Третья ORDER содержит номер заказа (но это не праймари кий, больше похоже на внешний ключ, но при этом такая таблица отсутствует в данном задании), позиция (вообще не понимаю что это и к чему оно), название продукта, количество (25 кг помидоров допустим) и единица измерения опять же.

Далее покажу таблицу с заполненными данными, их там совсем чуть-чуть

БД С ДАННЫМИ

Ответы

▲ 0Принят

Примерно такой запрос должен устроить для начала:

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, покажется странным в реализации в СУБД, но это удобство для пользователя ценно.