Ikke muligt? Udfordring accepteret. :)
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;
Dette vil give dig præcis hvad du beder om. Hvis employee og department er ikke heltal, cast til den matchende type.
Per kommentar fra @ypercube:count() skal være på en ikke-nul kolonne med items , så vi får 0 for ikke-eksisterende kriterier, ikke 1 .
Træk også yderligere kriterier op i LEFT JOIN betingelse (i.available i dette tilfælde), så du ikke udelukker ikke-eksisterende kriterier.
Ydeevne
Besvarelse af yderligere spørgsmål i kommentarfeltet.
Dette burde fungere meget godt. Med længere lister over kriterier, (LEFT) JOIN er nok den hurtigste metode.
Hvis du har brug for det så hurtigt som muligt, skal du sørge for at oprette en multicolumn indeks som:
CREATE INDEX items_some_name_idx ON items (employee, department);
Hvis (employee, department) skal være den PRIMARY KEY eller du skal have en UNIQUE begrænsning på de to kolonner, det ville også gøre det trick.