¿Imposible? Desafío aceptado. :)
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;
Esto le dará exactamente lo que estás pidiendo. Si employee y department no son enteros, se convierten al tipo coincidente.
Por comentario de @ypercube:count() debe estar en una columna no nula de items , entonces obtenemos 0 para criterios inexistentes, no 1 .
Además, obtenga criterios adicionales en LEFT JOIN condición (i.available en este caso), para no excluir criterios inexistentes.
Rendimiento
Abordar una pregunta adicional en un comentario.
Esto debería funcionar muy bien. Con listas más largas de criterios, (LEFT) JOIN es probablemente el método más rápido.
Si lo necesita lo más rápido posible, asegúrese de crear una multicolumn índice como:
CREATE INDEX items_some_name_idx ON items (employee, department);
Si (employee, department) debe ser la PRIMARY KEY o deberías tener un UNIQUE restricción en las dos columnas, eso también funcionaría.