sql >> Database >  >> RDS >> PostgreSQL

Een kolom gebruiken in sql join zonder deze toe te voegen aan group by-clausule

U heeft één rij per factuur nodig, dus verzamel payment_invoice eerst - het beste voordat je meedoet.
Als de hele tafel is geselecteerd, is het meestal het snelst om eerst samenvoegen en later meedoen :

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 is hier essentieel. U wilt geen facturen kwijtraken die geen corresponderende rijen hebben in payment_invoice (nog), wat zou gebeuren met een gewone JOIN .

Gebruik daarom COALESCE() voor de som van betalingen, die NULL kan zijn.

SQL Fiddle met verbeterde testcase.



  1. Hoe krijg ik BLOB van bestand in PL/SQL?

  2. SQL Server-prestatiestatistieken om de game voor te blijven

  3. array_push() vs. $array[] =.... Wat is het snelst?

  4. Dynamische query-opbouw voor PDO