sql >> Databasteknik >  >> RDS >> PostgreSQL

Använda en kolumn i sql join utan att lägga till den i grupp för sats

Du behöver en enda rad per faktura, så samla betalningsfaktura först – bäst innan du går med.
När hela tabellen är vald är det vanligtvis snabbast att samla först och gå med senare :

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);

VÄNSTER JOIN är väsentligt här. Du vill inte tappa fakturor som inte har några motsvarande rader i betalningsfaktura (ännu), vilket skulle hända med en vanlig JOIN .

Använd därför COALESCE () för summan av betalningar, som kan vara NULL.

SQL Fiddle med förbättrat testfall.



  1. Hur man undslipper enstaka citat, specialtecken i MySQL

  2. Varför returnerar inte denna sql-fråga några resultat som jämför flyttal?

  3. hur ställer jag in kommandot psql i cygwin?

  4. Använda backticks runt fältnamn