Niemożliwe? Wyzwanie przyjęte. :)
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;
Dzięki temu uzyskasz dokładnie o co prosisz. Jeśli employee i department nie są liczbami całkowitymi, rzutuj na pasujący typ.
Każdy komentarz z @ypercube:count() musi znajdować się w niepustej kolumnie items , więc otrzymujemy 0 dla nieistniejących kryteriów, a nie 1 .
Przeciągnij również dodatkowe kryteria do LEFT JOIN warunek (i.available w tym przypadku), więc nie wykluczasz nieistniejących kryteriów.
Wydajność
Adresowanie dodatkowego pytania w komentarzu.
To powinno działać bardzo dobrze. Przy dłuższych listach kryteriów (LEFT) JOIN jest prawdopodobnie najszybszą metodą.
Jeśli potrzebujesz go tak szybko, jak to możliwe, utwórz wielokolumnę indeks jak:
CREATE INDEX items_some_name_idx ON items (employee, department);
Jeśli (employee, department) powinien być PRIMARY KEY lub powinieneś mieć UNIQUE ograniczenie na dwie kolumny, to też załatwiłoby sprawę.