2013-03-11 52 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