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

Brug af en kolonne i sql join uden at tilføje den til gruppe for klausul

Du skal bruge en enkelt række pr. faktura, så samle payment_invoice først - bedst før du tilmelder dig.
Når hele bordet er valgt, er det typisk hurtigst at saml først og tilmeld dig senere :

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 er afgørende her. Du ønsker ikke at miste fakturaer, der ikke har nogen tilsvarende rækker i payment_invoice (endnu), hvilket ville ske med en almindelig JOIN .

Brug derfor COALESCE () for summen af ​​betalinger, som kan være NULL.

SQL violin med forbedret testcase.



  1. Fjernelse af standardsporingen – Del 1

  2. Databaseimplementering med opdateringer

  3. Flask :sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError) relationsbrugere eksisterer ikke

  4. 2 måder at returnere rækker, der indeholder ikke-alfanumeriske tegn i PostgreSQL