PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използване на колона в sql join без добавянето й към група по клауза

Имате нужда от един ред на фактура, така че обобщете payment_invoice първо - най-добре преди да се присъедините.
Когато е избрана цялата маса, обикновено най-бързо е обобщаване първо и присъединете се по-късно :

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 е от съществено значение тук. Не искате да губите фактури, които нямат съответстващи редове в payment_invoice (все още), което ще се случи с обикновен JOIN .

Съответно използвайте COALESCE () за сумата на плащанията, която може да е NULL.

SQL Fiddle с подобрен тестов случай.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INSERT COMMAND ::ГРЕШКА:стойността на колоната не съществува

  2. Създайте индекс с няколко колони, за да наложите уникалност

  3. Как мога да отменя операторите .. и ... на Ruby Ranges, за да приема Float::INFINITY?

  4. Как работи функцията Degrees() в PostgreSQL

  5. Имена на таблици в Postgresql и unicode:Защо не мога да избера името на таблицата от информационната схема, когато съдържа unicode знаци?