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.