2013-04-07 80 views
2

我想创建一个报告,将显示客户有一个未解决的帐户余额,但我似乎无法得到它使用左连接工作。Mysql左加入总和标准

我有3个表 - 客户,购买和支付,我想显示客户,其采购总额费用少支付大于0

到目前为止,我有以下查询:

mysqli_query("SELECT customers.name as name, SUM(purchases.cost) as cost, SUM(payments.paymentamount) as payments FROM customers 
LEFT JOIN purchases ON purchases.customerid = customers.id 
LEFT JOIN payments ON payments.customerid = customers.id 
WHERE (cost - payments) > 0 
GROUP BY customers.id"); 

任何人都可以看到为什么这不工作?

感谢您的帮助!

回答

2

您需要计算每个customerID的子查询上的每个总数,以避免不正确的结果。

SELECT a.*, 
     COALESCE(b.totalPurchase , 0) - COALESCE(c.totalPayment , 0) AS Balance 
FROM customers a 
     LEFT JOIN 
     (
      SELECT customerid, SUM(cost) totalPurchase 
      FROM purchases 
      GROUP BY customerid 
     ) b ON a.ID = b.customerID 
     LEFT JOIN 
     (
      SELECT customerid, SUM(paymentamount) totalPayment 
      FROM payments 
      GROUP BY customerid 
     ) c ON a.ID = c.customerID 
WHERE COALESCE(b.totalPurchase , 0) - COALESCE(c.totalPayment , 0) > 0 
+0

谢谢JW。但是当我尝试使用while($ row1 = mysqli_fetch_assoc($ q1))显示结果时,然后$ row1 ['totalPurchase']和$ row1 ['totalPayment']都返回0.任何想法? – mckeegan375 2013-04-07 15:07:46

+0

当客户没有来自“采购”表或“付款”表的记录时,它将返回“0”。你可以提供样本记录吗? ':)' – 2013-04-07 15:10:06

+0

谢谢。我不知道如何发布片段,但你是正确的 - 在很多情况下,客户将始终有购买,但可能已经支付任何款项。但是,我的报告显示所有客户的采购和付款都为0,即使他们有两个实例。谢谢! – mckeegan375 2013-04-07 15:15:47