sql >> Base de Datos >  >> RDS >> PostgreSQL

Usar una columna en sql join sin agregarla a la cláusula group by

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.