PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Używanie kolumny w sql join bez dodawania jej do klauzuli group by

Potrzebujesz jednego wiersza na fakturę, więc zagreguj payment_invoice pierwszy - najlepiej zanim dołączysz.
Gdy zaznaczony jest cały stół, zazwyczaj najszybciej jest najpierw agreguj i dołącz później :

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

DOŁĄCZENIE LEWE jest tutaj niezbędna. Nie chcesz tracić faktur, które nie mają odpowiadających wierszy w payment_invoice (jeszcze), co zdarzyłoby się przy zwykłym JOIN .

W związku z tym użyj COALESCE () dla sumy płatności, która może wynosić NULL.

Skrzypce SQL z ulepszonym przypadkiem testowym.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest maksymalna wielkość partii JDBC?

  2. Jak używać ALIAS w klauzuli PostgreSQL ORDER BY?

  3. Jak poznać strefę czasową znacznika czasu w postgresql 8.3?

  4. Porządkowanie wyników gorliwie ładowanych modeli zagnieżdżonych w Node Sequelize

  5. Błędy dwithin GeoDjango podczas korzystania z django.contrib.gis.measure.D