Формула для total_amount
выглядит как rate * quantity
для каждого продукта + ship_chr
(примечание: сокращения усложняют понимание кода).
Поскольку каждый заказ имеет только одну общую цену, в этом нет необходимостидля отдельной таблицы.Вместо этого добавьте столбец к orders
.
alter table orders add column total_price integer
Или вы можете рассчитать это на лету.Используя схему из моего другого ответа ...
select sum(op.rate * op.quantity) + o.ship_chr
from order_products op
join orders o on o.id = op.order_id
group by op.order_id
group by op.order_id
группирует все строки одного порядка вместе.Затем мы можем использовать агрегатную функцию sum
, чтобы сложить все строки с одинаковым идентификатором order_id.
Но тогда вы должны обеспечить его актуальность.Вы можете сделать это для всех заказов с update
, используя select
, чтобы получить общую цену в виде подзапроса .
update orders
set total_price = (
select sum(op.rate * op.quantity) + orders.ship_chr
from order_products op
where orders.id = op.order_id
group by op.order_id
)
И когда вы добавляете к заказу, который вы 'Придется помнить, чтобы также обновить общее.Вы можете сделать это на лету ...
insert into order_products (order_id, product_id, quantity, rate) values
(1, 1, 100, 3);
update orders
set total_price = total_price + (100 * 3)
where id = 1;
Но, вероятно, безопаснее просто пересчитать весь заказ после каждого изменения.
insert into order_products (order_id, product_id, quantity, rate) values
(1, 1, 100, 3);
update orders
set total_price = (
select sum(op.rate * op.quantity) + orders.ship_chr
from order_products op
where orders.id = op.order_id
group by op.order_id
)
where id = 1;