SQL查询从更多依赖表中获取SUM

时间:2017-03-10 08:18:47

标签: mysql left-join

我有以下MySQL数据库结构:

表sales_order - id,name,...

id | name
------------------
 1 | Order Test

表sales_order_item - id,order_id,name,amount_dispatched ...

id | order_id | name   | amount_dispatched
------------------------------------------
 1 |        1 | Item 1 |      5
 2 |        1 | Item 2 |     10

表sales_order_item_invoice - id,item_id,amount,...

id | item_id | amount
---------------------
 1 |       1 |     3
 2 |       2 |     5
 3 |       2 |     5

这三个表通过外键链接。表"发票"可以在" item"中为一行添加更多行。表"项目"可以在" order"。

中为一行添加更多行

现在,我需要创建SQL查询,返回表sales_order中的所有行,并在其中附加一些来自其他表的数据 - amount_dispatched和amount_invoiced:

已发送=所有订单项目的总和' amount_dispatched 发票=所有发票的总和'金额(如果没有发票,则为0)

这样的查询似乎很简单:

SELECT 
    `sales_order`.*,    
    SUM(`sales_order_item`.`amount_dispatched`) AS dispatched,
    SUM(`sales_order_item_invoice`.`amount`) AS invoiced,    
FROM `sales_order` 
LEFT JOIN `sales_order_item` ON `sales_order`.`id` = `sales_order_item`.`order_id` 
LEFT JOIN `sales_order_item_invoice` ON `sales_order_item`.`id` =`sales_order_item_invoice`.`item_id` 
GROUP BY `sales_order`.`id`

结果包含所有订单 - 好的 结果包含发票金额总和 - 好的 " amount_dispatched"的结果无效 - 如果该项目在item_invoice中有更多行,则该项目的金额会被累加几次,因此对于上面的示例,我得到:

id | name       | dispatched | invoiced
---------------------------------------
 1 | Order Test |       25   |      13

Amount_dispatched是25,但我希望它是15。

知道如何更正我的SQL查询吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

首先,使用子查询对sales_order_item_invoice中的发票金额进行汇总,然后离开加入。

SELECT 
    `sales_order`.*,    
    SUM(`sales_order_item`.`amount_dispatched`) AS dispatched,
    SUM(t.`amount`) AS invoiced
FROM `sales_order` 
LEFT JOIN `sales_order_item` ON `sales_order`.`id` = `sales_order_item`.`order_id` 
LEFT JOIN (
    SELECT item_id, SUM(amount) AS amount
    FROM `sales_order_item_invoice`
    GROUP BY item_id
) t ON `sales_order_item`.`id` = t.`item_id` 
GROUP BY `sales_order`.`id`