2017-01-10 77 views
1

我有三个表:Stock,Orderline和Order。我在Order表中有一个Total列,我想包含每个订单的订单总和。 Orderline表由Order_id,Stock_id和Qty组成,Stock表有Stock_id和Price。我可以筛选与每个Order_id关联的Stock_ID并显示每个订单的数量,我认为我需要使用内部联接来计算每个订单的成本,方法是将每个Stock_id的价格相加并将其乘以订单行中的数量表和股票表中的价格,但我不知道从哪里开始。我还希望在计算每个Order_id时将其添加到数据库中的Total列中,并且不知道如何执行该操作。我正在使用SQLite3。任何帮助将不胜感激。3表内部联接的SQL计算

顺序表: ORDER_ID,ORDER_TOTAL,order_datetime

订单行表: ORDER_ID,STOCK_ID,数量

库存表: STOCK_ID,STOCK_PRICE,stock_name

+0

这可能有助于显示带有列标题和一些示例行的表格 – BYates

+0

我不确定如何在此处使用表格,并且很难显示它们。 –

回答

1

这是INNER JOIN基本查询按订单编号进行分组,按顺序向您提供总数。你可以在GROUP BY之前的WHERE条款中做任何你需要的过滤器。

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不支持计算列,你有两个选择:

  1. 创建添加到Order表来存储总价值一列,然后创建一个Orderline触发和Stock表来重新计算修改记录的总数。
  2. 将上述查询转换为单独的视图,然后在您需要总数时,从创建视图到Order表执行INNER JOIN
+0

太好了,谢谢你。我认为创建触发器只会将总数添加到新数据中? –

+0

为了获得完整的准确性,您需要INSERT/UPDATE/DELETE触发器,以便在对股票价格或订单项数量进行任何修改时确保您的“总计”相应地针对修改的库存/订单进行更新。如果您需要锁定订单时的价格,那么我会在Orderline表中放置一个'Price'字段,并且仅在Orderline上进行触发操作,并且计算忽略'Stock'表格而仅支持数量和价格在Orderline。 –