Não é possivel? Desafio aceito. :)
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;
Isso lhe dará exatamente o que você está pedindo. Se
employee
e department
não são inteiros, convertidos para o tipo correspondente. Por comentário de @ypercube:count() precisa estar em uma coluna não nula de
items
, então obtemos 0
para critérios inexistentes, não 1
. Além disso, puxe critérios adicionais para o
LEFT JOIN
condição (i.available
neste caso), para não excluir critérios inexistentes. Desempenho
Respondendo a pergunta adicional no comentário.
Isso deve funcionar muito bem. Com listas de critérios mais longas,
(LEFT) JOIN
é provavelmente o método mais rápido. Se você precisar dele o mais rápido possível, certifique-se de criar uma multicolumn índice Curti:
CREATE INDEX items_some_name_idx ON items (employee, department);
Se
(employee, department)
deve ser a PRIMARY KEY
ou você deve ter um UNIQUE
restrição nas duas colunas, isso também funcionaria.