将Sum与select join和union结合使用

时间:2017-08-18 10:55:15

标签: mysql select join sum union

我需要像这样加入2个查询

SELECT * from contracts join customers on customer.id=contracts.customer

和(12234是解释客户)

SELECT *,sum(cast(amount as UNSIGNED)) as total FROM(    
SELECT * from invoices
where customer='123456'
UNION
SELECT * from paypal_invoices
where customer='123456') t1

在第一个查询中,我只是根据我们拥有的活动合约提取普通客户列表。

在第二部分中,我提取特定客户的任何发票总和

所以我基本上需要像第一个查询一样提取所有客户,但我还需要一个列,其中包含此特定客户的所有发票总和。 谢谢。

1 个答案:

答案 0 :(得分:2)

一种方法是相关子查询或left join s:

select co.*, cu.*, i.amount, pi.amount as paypal_amount,
       ( coalesce(i.amount, 0) + coalesce(pi.amount, 0) ) as total       
from contracts co join
     customers cu
     on cu.id = co.customer left join
     (select customer, sum(amount) as amount
      from invoices
      group by customer
     ) i
     on i.customer = cu.id left join
     (select customer, sum(amount) as amount
      from paypal_invoices
      group by customer
     ) pi
     on pi.customer = cu.id;

这里有两个关键点。首先,确保在进行连接之前进行聚合。这可以防止连接乘以行数并生成不正确的结果。同样,这会使用LEFT JOIN来确保包含所有客户,即使是那些没有发票的客户。

第二个想法:不要使用UNION。实际上,您的查询可能不正确。 UNION删除重复项 - 包括表内和表之间。使用UNION ALL更安全。或者,在这种情况下,根本不需要它。