使用连接表中的条件限制SUM()中包含的结果?

时间:2012-05-02 14:07:55

标签: mysql sql join

我正在尝试列出我的产品表,但链接到我的交货单,以便给出我某些状态的库存总和;分配,派遣等

有一个'status'字段来定义当前交付的位置; 1 =已分配,2 =已分派,3 =已交付等

到目前为止,这是我的目标

SELECT product.*, sum(quantity) AS allocated FROM product 
    LEFT JOIN delivery_product ON ( product.id = product_id ) 
    LEFT JOIN delivery ON ( delivery_id = delivery.id AND delivery.status = 1 ) 
GROUP BY code           
ORDER BY code

它包含来自delivery_product的所有数量匹配,而我只想包含交货订单状态= 1的那些。我认为这是因为我在状态限制开始之前首先加入delivery_product表但是我还能怎样做此?

如果你能看到完全接近我的任务的更好方法,那么奖励积分:)

-

product
id  code   stock
1   ABC    1000
2   DEF    2000

delivery
id  status   date   etc
1   1        etc    etc

delivery-product
id  delivery_id   product_id   quantity
1   1             1            500


results
product.id product.code product.stock allocated
1          ABC          1000          500
2          DEF          2000          0

1 个答案:

答案 0 :(得分:1)

我认为对您的查询进行一些小修改应该有效:

SELECT product.*
,   sum(case when delivery.status = 1 then quantity else 0 end) AS allocated
FROM product 
    LEFT JOIN delivery_product ON ( product.id = product_id ) 
    LEFT JOIN delivery ON ( delivery_id = delivery.id AND delivery.status = 1 ) 
GROUP BY code           
ORDER BY code

您可以通过将delivery联接转换为内部从左外部来避免条件,但如果状态为quantity的传递记录,查询将不会返回1为零的行该产品缺少。