2017-03-10 43 views
1

得到SUM我有以下MySQL數據庫結構:SQL查詢,以便從更依賴表

表sales_order的 - ID,姓名,...

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

表sales_order_item - ID,ORDER_ID,名稱, 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,金額,...

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

這三個表通過外鍵鏈接在一起。表「發票」可以在「項目」中有一行更多的行。表「項目」可以按「順序」在一行中有更多行。

現在,我需要創建一個從表sales_order的返回所有行並追加其它表中有一些數據的SQL查詢 - amount_dispatched和amount_invoiced:

派出=所有訂單的項目的總和amount_dispatched 發票= SUM所有發票金額(或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

首先,使用子查詢對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` 
+0

謝謝。有用。只是一個額外的問題 - 是否有可能沒有子查詢呢?我需要通過Nette NDB構建它,並且它不支持JOIN中的子查詢:( – bigmuscle

+0

@bigmuscle沒有子查詢,我認爲你應該在你的邏輯層中做到這一點。 – Blank