¿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.