PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

SELECT COUNT(*) - kembalikan 0 bersama dengan bidang yang dikelompokkan jika tidak ada baris yang cocok

Tidak memungkinkan? Tantangan diterima. :)

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;

Ini akan memberi Anda tepat apa yang Anda minta. Jika employee dan department bukan bilangan bulat, dilemparkan ke jenis yang cocok.

Per komentar dari @ypercube:count() harus berada di kolom non-null dari items , jadi kita mendapatkan 0 untuk kriteria yang tidak ada, bukan 1 .

Juga, tarik kriteria tambahan ke dalam LEFT JOIN kondisi (i.available dalam hal ini), jadi Anda tidak mengecualikan kriteria yang tidak ada.

Kinerja

Menjawab pertanyaan tambahan dalam komentar.
Ini akan bekerja dengan sangat baik. Dengan daftar kriteria yang lebih panjang, (LEFT) JOIN mungkin merupakan metode tercepat.

Jika Anda membutuhkannya secepat mungkin, pastikan untuk membuat multicolumn indeks seperti:

CREATE INDEX items_some_name_idx ON items (employee, department);

Jika (employee, department) harus PRIMARY KEY atau Anda harus memiliki UNIQUE kendala pada dua kolom, itu juga akan berhasil.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara merender hasil postgresql di ejs menggunakan node pg?

  2. Bagaimana cara mencocokkan ekspresi reguler pada kolom untuk PostgreSQL di EF Core?

  3. Kueri dalam kueri:Apakah ada cara yang lebih baik?

  4. Bagaimana Postgresql SALIN KE STDIN Dengan CSV lakukan saat konflik melakukan pembaruan?

  5. Menggunakan parameter posisi ($ 1,..) di psql