2013-04-07 3 views
2

Я пытаюсь создать отчет, в котором будут показаны клиенты, у которых есть непогашенный остаток на счете, но я не могу заставить его работать, используя левое соединение.Mysql Left Join with Sum Criteria

У меня есть 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

Thanks JW. У меня почти все работает, когда я пытаюсь отображать результаты, используя while ($ row1 = mysqli_fetch_assoc ($ q1)), тогда $ row1 ['totalPurchase'] и $ row1 ['totalPayment'] возвращают 0. Любые идеи? – mckeegan375

+0

он вернет '0', когда у клиента нет записей в таблице« Покупки »или« Платежи ». Можете ли вы дать образцы записей? ':)' –

+0

Спасибо. Я не уверен, как отправлять отрывки, но вы правы - во многих случаях клиенты всегда будут покупать, но могут совершать какие-либо платежи. Тем не менее, мой отчет показывает 0 для всех клиентов по покупкам и платежам, даже если у них есть экземпляры обоих. Благодаря! – mckeegan375