Pas possible? Défi accepté. :)
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;
Cela vous donnera exactement ce que vous demandez. Si employee et department ne sont pas entiers, transtypés dans le type correspondant.
Par commentaire de @ypercube :count() doit être sur une colonne non nulle de items , nous obtenons donc 0 pour les critères inexistants, pas 1 .
Aussi, extrayez des critères supplémentaires dans le LEFT JOIN état (i.available dans ce cas), vous n'excluez donc pas les critères inexistants.
Performances
Répondre à une question supplémentaire en commentaire.
Cela devrait très bien fonctionner. Avec des listes de critères plus longues, (LEFT) JOIN est probablement la méthode la plus rapide.
Si vous en avez besoin le plus rapidement possible, assurez-vous de créer une multicolumn index comme :
CREATE INDEX items_some_name_idx ON items (employee, department);
Si (employee, department) devrait être la PRIMARY KEY ou vous devriez avoir un UNIQUE contrainte sur les deux colonnes, cela ferait aussi l'affaire.