sql >> Databáze >  >> RDS >> PostgreSQL

Použití sloupce v SQL join bez jeho přidání do skupiny podle klauzule

Na každou fakturu potřebujete jeden řádek, proto agregujte payment_invoice první – nejlépe, než se připojíte.
Když je vybrána celá tabulka, je obvykle nejrychlejší aggregate first a připojit se později :

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 je zde zásadní. Nechcete ztratit faktury, které nemají žádné odpovídající řádky v payment_invoice (zatím), což by se stalo s prostým JOIN .

V souladu s tím použijte COALESCE() pro součet plateb, který může být NULL.

SQL Fiddle s vylepšeným testovacím případem.



  1. Datové sklady Profilování dat ETL pomocí Oracle Warehouse Builder

  2. Upozornění:join() [function.join]:Neplatné argumenty předané v C

  3. Výpočet vzdálenosti mezi dvěma body (zeměpisná šířka, délka)

  4. Přesun dat ze staré tabulky do jiné tabulky PHP MYSQL