使用LEFT JOIN进行SUM +计算的SQL查询

时间:2012-06-21 14:50:55

标签: mysql sql

我的SQL查询有问题。如果给定的订单包含项目,则女巫不包含子项目,则为零订单的总价格,否则此查询工作正常。

SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * subi.`quantity_kg` * subi .`price`)) as total_price
FROM `order` o
JOIN `customer` c ON o.`id_customer`=c.`id`
LEFT JOIN `order_item` i ON i.`id_order`= o.`id`
LEFT JOIN `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id`

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

在您的子项目字段中使用coalesce ifnull

SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * coalesce(subi.`quantity_kg`, 0) * coalesce(subi .`price`, 0))) as total_price

这可以确保这些字段不会因为null而破坏整个计算。例如。 null + 1 = null

答案 1 :(得分:1)

SELECT o.`id`, o.`date`, c.`name`,
      ((i.`quantity` * i.`price`) +
      SUM(i.`quantity` * IFNULL(subi.`quantity_kg`, 0) * IFNULL(subi .`price`, 0))) as total_price
FROM `order` o
JOIN `customer` c ON o.`id_customer`=c.`id`
LEFT JOIN `order_item` i ON i.`id_order`= o.`id`
LEFT JOIN `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id`

如果您知道order_item应该存在,那么您应该为此表使用INNER JOIN。

答案 2 :(得分:1)

我怀疑问题是你返回的是NULL,而不是0.为了解决这个问题,你只需要coalesce函数来处理NULL情况:

SELECT o.`id`, o.`date`, c.`name`,
       ((i.`quantity` * i.`price`) +
        SUM(i.`quantity` * coalesce(subi.`quantity_kg`, 0) * coalesce(subi .`price`, 0))
       ) as total_price
FROM `order` o JOIN
     `customer` c
     ON o.`id_customer`=c.`id` LEFT JOIN
     `order_item` i
     ON i.`id_order`= o.`id` LEFT JOIN
     `order_subitem` subi ON si.`id_product`= i.`id_product`
GROUP BY o.`id`