2017-01-10 5 views
1

У меня есть три таблицы: запас, заказ и заказ. У меня есть столбец Total в таблице Order, который я хочу содержать сумму ордеров для каждого заказа. Таблица Orderline состоит из Order_id, Stock_id и Qty, таблица акций Stock_id и Price. Я могу фильтровать Stock_ids, связанные с каждым Order_id, и отображать Qty для каждого, и я думаю, что мне нужно использовать внутреннее соединение для вычисления стоимости каждого заказа путем суммирования цены каждого Stock_id и умножения его на Qty в позиции заказа таблицу и цену в таблице «Сток», но я не уверен, с чего начать. Я также хочу, чтобы это было добавлено в столбец Total в базе данных при расчете для каждого Order_id и не знаю, как это сделать. Я использую SQLite3. Любая помощь будет принята с благодарностью.SQL Calculations on 3 Table Inner Join

Таблица заказа: order_id, order_total, order_datetime

OrderLine Таблица: order_id, stock_id, кол-во

Stock Таблица: stock_id, STOCK_PRICE, stock_name

+0

Возможно, это поможет показать таблицы с заголовками столбцов и некоторыми образцовыми строками – BYates

+0

Я не уверен, как использовать таблицы здесь, и их сложно показать. –

ответ

1

Это основной запрос с INNER JOIN сгруппированы по идентификатору заказа, чтобы дать вам общее количество по заказу. Вы можете делать любые фильтры, которые вам нужны, в предложении WHERE до GROUP BY.

SELECT 
    O.order_id, 
    SUM(S.stock_price * OL.qty) AS [Total] 
FROM Order O 
    INNER JOIN Orderline OL 
     ON OL.order_id = O.order_id 
    INNER JOIN Stock S 
     ON S.stock_id = OL.stock_id 
GROUP BY 
    O.order_id 

Хотя SQLite не поддерживает вычисляемые столбцы, вы бы 2 варианта:

  1. Создать столбец добавляется к Order таблицы для хранения значения от общего числа, а затем создать триггер Orderline и Stock таблицы для пересчета итогов для измененных записей.
  2. Преобразуйте запрос выше в отдельный вид, затем сделайте INNER JOIN из созданного вида в таблицу Order всякий раз, когда вам нужны итоговые значения.
+0

Отлично, спасибо. Я предполагаю, что создание триггера только добавит итоговые данные к новым данным? –

+0

Для полной точности вам понадобятся триггеры INSERT/UPDATE/DELETE, так что при любой модификации цен на акции или количества строк заказа количество вашего 'Total' будет соответствующим образом обновляться для модифицированных запасов/заказов. Если вам нужно заблокировать то, что цена была в момент заказа, тогда я бы поместил поле «Цена» в таблицу Orderline и сделал триггер только на Orderline, а расчет проигнорировал таблицу «Stock» в пользу только количества и цена в Orderline. –