PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng một cột trong phép nối sql mà không thêm nó vào nhóm theo mệnh đề

Bạn cần một hàng cho mỗi hóa đơn, vì vậy hãy tổng hợp payment_invoice đầu tiên - tốt nhất là trước khi bạn tham gia.
Khi toàn bộ bảng được chọn, thường là nhanh nhất để tổng hợp trước tham gia sau :

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 là điều cần thiết ở đây. Bạn không muốn mất các hóa đơn không có hàng tương ứng trong payment_invoice (chưa), điều này sẽ xảy ra với JOIN đơn giản .

Theo đó, hãy sử dụng COALESCE() đối với tổng số tiền thanh toán, có thể là NULL.

SQL Fiddle với trường hợp thử nghiệm được cải thiện.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Điền nhiều trường 2many (odoo 8)

  2. Docker container cho Postgres 9.1 không để lộ cổng 5432 cho máy chủ

  3. Tương đương với univot () trong PostgreSQL

  4. Hàm postgres trả về một hàng dưới dạng giá trị JSON

  5. Cách pg_sleep () hoạt động trong PostgreSQL