2013-03-11 50 views
3

我試圖用一個SQL查詢得到5個不同表中的結果的總和。我有5個表,每個表可能包含屬於訂單的記錄。 5個表中所有記錄的總和決定了總訂單價格。MySQL計算選擇不使用空的子選擇

搜索在這個論壇上,我想出了以下查詢:

SELECT 
    OrderTotal.total + Shipping.amount + Service.amount - Gift.amount - RMA.total as TotalCosts 
FROM 
    (SELECT SUM(price * amount) AS total FROM order WHERE order_id=123456) OrderTotal 
    (SELECT amount FROM shipping WHERE order_id=123456) Shipping, 
    (SELECT amount FROM service WHERE order_id=123456) Service, 
    (SELECT SUM(price * amount) AS total FROM rma WHERE order_id=123456) RMA, 
    (SELECT amount FROM gift WHERE order_id=123456) Gift 

我現在面臨的問題是,當例如最後一個SELECT返回0行,不返回總TotalCosts。

如何解決這個問題?

+0

奧凱,我對我的問題回答如下。不過,我現在需要在遍歷所有訂單的循環中執行此操作。所以不要給它'order_id = 123456',而是列出所有的訂單。 – Timo002 2013-03-12 07:34:16

回答

1

如何使用UNION

SELECT order_id, SUM(total) GrandTotal 
FROM 
     (
      SELECT order_id, SUM(price * amount) AS total 
      FROM `order` 
      WHERE order_id = 123456 
      UNION ALL 
      SELECT order_id, amount AS total 
      FROM shipping 
      WHERE order_id = 123456 
      UNION ALL 
      SELECT order_id, amount AS total 
      FROM service 
      WHERE order_id = 123456 
      UNION ALL 
      SELECT order_id, SUM(price * amount) AS total 
      FROM rma 
      WHERE order_id = 123456 
      UNION ALL 
      SELECT order_id, amount AS total 
      FROM gift 
      WHERE order_id=123456 
     ) subTable 
GROUP BY order_id 
+0

太棒了!這是答案! – Timo002 2013-03-11 16:33:21

+0

不客氣':D'很高興幫助':D' – 2013-03-11 16:33:39

+0

此查詢還返回order_id「0」與GrandTotal的「NULL」。我不明白爲什麼.. – Timo002 2013-03-12 07:14:10

0

您可以使用IFNULL功能,解決

SELECT 
    IFNULL(OrderTotal.total,0) + IFNULL(Shipping.amount + IFNULL(Service.amount - IFNULL(Gift.amount,0) - RMA.total as TotalCosts 
FROM 
    (SELECT SUM(price * amount) AS total FROM order WHERE order_id=123456) OrderTotal 
    (SELECT amount FROM shipping WHERE order_id=123456) Shipping, 
    (SELECT amount FROM service WHERE order_id=123456) Service, 
    (SELECT SUM(price * amount) AS total FROM rma WHERE order_id=123456) RMA, 
    (SELECT amount FROM gift WHERE order_id=123456) Gift 
+0

您提出的查詢給出了一個錯誤。我將它改爲:IFNULL(OrderTotal.total,0)+ IFNULL(Shipping.amount,0)+ IFNULL(Service.amount,0) - IFNULL(Gift.amount,0) - IFNULL(RMA.total ,0)AS TotalCosts **,但也不返回任何內容。它只是說我的查詢是成功的,但不返回任何內容。 – Timo002 2013-03-12 07:16:16

+0

對不起,我弄錯了,你還需要在子查詢中使用一個組,以便至少返回null。所以你的子查詢必須像「SELECT amount FROM gift WHERE order_id = 123456 ** group by order_id **」 – georgecj11 2013-03-13 17:55:36