PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden einer Spalte in einer SQL-Verknüpfung, ohne sie der Group by-Klausel hinzuzufügen

Sie benötigen eine einzelne Zeile pro Rechnung, also aggregieren Sie payment_invoice zuerst - am besten, bevor Sie beitreten.
Wenn der gesamte Tisch ausgewählt ist, ist es normalerweise am schnellsten, zuerst aggregieren und später beitreten :

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 ist hier unerlässlich. Sie möchten keine Rechnungen verlieren, die keine entsprechenden Zeilen in payment_invoice haben (noch), was mit einem einfachen JOIN passieren würde .

Verwenden Sie dementsprechend COALESCE() für die Summe der Zahlungen, die NULL sein kann.

SQL-Fiddle mit verbessertem Testfall.