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.