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