Necesita una sola fila por factura, así que agregue payment_invoice
primero:mejor antes de unirse.
Cuando se selecciona toda la tabla, generalmente es más rápido agregar primero y unirse más tarde
:
SELECT to_char(date_trunc('month', i.create_datetime), 'MM/YYYY') AS month
, count(*) AS total_invoice_count
, (sum(i.total) - COALESCE(sum(pi.paid), 0)) AS outstanding_balance
FROM invoice i
LEFT JOIN (
SELECT invoice_id AS id, sum(amount) AS paid
FROM payment_invoice pi
GROUP BY 1
) pi USING (id)
GROUP BY date_trunc('month', i.create_datetime)
ORDER BY date_trunc('month', i.create_datetime);
LEFT JOIN
es esencial aquí. No desea perder facturas que no tienen filas correspondientes en payment_invoice
(todavía), lo que sucedería con un simple JOIN
.
En consecuencia, use COALESCE()
por la suma de los pagos, que podría ser NULL.
SQL Fiddle con caso de prueba mejorado.