Как получить данные из двух связанных таблиц и поместить в 3-ю таблицу - PullRequest
0 голосов
/ 13 октября 2018

Общая сумма в Таблице 3 зависит от Таблицы 1 (Ship_chr) и нескольких записей в таблице 2 (количественный * коэффициент).

Каким будет запрос sqlite3 для достижения этой цели?

table 1:
order_ID  date   buyer  ship_chr  
001       01/01  abc    15        
002       05/01  xyz    10       

table 2:
order_ID  prod    quantity   rate
001       pen     50         2
001       paper   25         1
001       pin     50         2
002       paper   25         1
002       pen     100        2

table 3:
order_ID  total_amount
001       240
002       235

Ответы [ 4 ]

0 голосов
/ 13 октября 2018

Формула для 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;
0 голосов
/ 13 октября 2018

Присоединение к order_id;SUM(t2.prod * t2.quantity) чтобы получить доход по идентификатору заказа, AVG(ship_chr), чтобы добавить ship_chr только один раз.

SELECT t2.order_id AS order_id, 
      SUM(t2.prod * t2.quantity) + AVG(t1.ship_chr) AS total_amount
FROM table2 t2 LEFT JOIN table1 t1
ON t2.order_id = t1.ordeR_id
GROUP BY t2.order_id
0 голосов
/ 13 октября 2018

Вы можете использовать внутреннее объединение, сумму и группирование по

select a.order_ID, sum(a.quantity  * a.rate) + b.ship_chr as total_amount
from table2 a 
inner join table1 b on a.order_ID = b.order_ID
group by a.order_ID,  b.ship_chr

или использовать запрос на сумму

select t1.order_ID, t1.tot + b.ship_chr total_amount
from table1 b
inner join (
    select a.order_ID, sum(a.quantity  * a.rate)  tot
    from table2 a 
    group by a.order_ID
) t1 on t1.order_ID = b.order_ID
0 голосов
/ 13 октября 2018

Я думаю, вам нужно ниже

   INSERT INTO t3
   SELECT t1.order_ID, sum(t2.quantity*t2.rate)+t1.ship_chr as total_amount
   FROM table_1 t1 join table_2 t2 on t1.order_ID=t2.order_ID
   group by t1.order_ID,t1.ship_chr

Объединить две таблицы и использовать sum() статистическую функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...