PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Utilizzo di una colonna in sql join senza aggiungerla alla clausola group by

Hai bisogno di una singola riga per fattura, quindi aggrega payment_invoice first - preferibilmente prima di entrare.
Quando viene selezionato l'intero tavolo, in genere è più veloce prima aggrega e unisciti più tardi :

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 è essenziale qui. Non vuoi perdere fatture che non hanno righe corrispondenti in payment_invoice (ancora), cosa che accadrebbe con un semplice JOIN .

Di conseguenza, usa COALESCE() per la somma dei pagamenti, che potrebbe essere NULL.

SQL Fiddle con test case migliorato.