2013-04-07 2 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

감사합니다. 그러나 나는 ($ row1 = mysqli_fetch_assoc ($ q1)), 그리고 나서 $ row1 [ 'totalPurchase']와 $ row1 [ 'totalPayment'] 둘 다 0을 반환하면서 결과를 표시하려고 할 때 거의 작동합니다. – mckeegan375

+0

고객이'Purchases' 테이블이나'Payments' 테이블에 레코드가 없으면'0'을 반환합니다. 샘플 레코드를 줄 수 있습니까? ':)' –

+0

고마워. 스 니펫을 게시하는 방법을 잘 모르지만 정확합니다. 많은 경우 고객은 항상 구매할 수 있지만 지불 한 것일 수 있습니다. 그러나 두 보고서의 인스턴스가있는 경우에도 구매 및 지불에 대한 모든 고객에 대한 보고서에 0이 표시됩니다. 감사! – mckeegan375