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.