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

CHỌN ĐẾM (*) - trả về 0 cùng với các trường được nhóm nếu không có hàng nào phù hợp

Không thể? Đã chấp nhận thử thách. :)

WITH x(employee, department) AS (
   VALUES
    (1::int, 2::int)
   ,(3, 4)
   ,(5, 6)
    -- ... more combinations
   )
SELECT x.employee, x.department, count(i.employee) AS ct
FROM   x
LEFT   JOIN items i ON i.employee = x.employee
                   AND i.department = x.department
                   AND i.available
GROUP  BY x.employee, x.department;

Điều này sẽ cung cấp cho bạn chính xác những gì bạn đang yêu cầu. Nếu employeedepartment không phải là số nguyên, được truyền đến kiểu phù hợp.

Mỗi nhận xét từ @ypercube:count () phải nằm trên cột items không rỗng , vì vậy chúng tôi nhận được 0 cho tiêu chí không tồn tại, không phải 1 .

Ngoài ra, kéo thêm tiêu chí vào LEFT JOIN điều kiện (i.available trong trường hợp này), vì vậy bạn không loại trừ các tiêu chí không tồn tại.

Hiệu suất

Giải quyết câu hỏi bổ sung trong nhận xét.
Điều này sẽ hoạt động rất tốt. Với danh sách tiêu chí dài hơn, (LEFT) JOIN có lẽ là phương pháp nhanh nhất.

Nếu bạn cần nó càng nhanh càng tốt, hãy đảm bảo tạo nhiều cột chỉ mục như:

CREATE INDEX items_some_name_idx ON items (employee, department);

If (employee, department) phải là PRIMARY KEY hoặc bạn phải có UNIQUE ràng buộc trên hai cột, điều đó cũng sẽ thực hiện thủ thuật.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để thực hiện cập nhật theo tầng?

  2. Cách thay đổi người dùng thành Superuser trong PostgreSQL

  3. Trả lại danh sách các múi giờ được hỗ trợ bởi PostgreSQL

  4. Tham chiếu cột không rõ ràng trong INSERT ... ON CONFLICT DO UPDATE

  5. Quản lý tính khả dụng cao của PostgreSQL - Phần I:Chuyển đổi dự phòng tự động PostgreSQL