Nemožné? Výzva přijata. :)
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;
Tím získáte přesně o co žádáte. Pokud employee
a department
nejsou celé číslo, přetypují se na odpovídající typ.
Za komentář od @ypercube:count() musí být v nenulovém sloupci items
, takže dostaneme 0
pro neexistující kritérium, nikoli 1
.
Také vytáhněte další kritéria do LEFT JOIN
stav (i.available
v tomto případě), takže nevyloučíte neexistující kritéria.
Výkon
Doplňující dotaz v komentáři.
To by mělo fungovat velmi dobře. S delšími seznamy kritérií (LEFT) JOIN
je pravděpodobně nejrychlejší metoda.
Pokud to potřebujete co nejrychleji, nezapomeňte si vytvořit multicolumn index jako:
CREATE INDEX items_some_name_idx ON items (employee, department);
Pokud (employee, department)
by měl být PRIMARY KEY
nebo byste měli mít UNIQUE
omezení na dva sloupce, to by taky stačilo.