Ikke muligt? Udfordring accepteret. :)
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;
Dette vil give dig præcis hvad du beder om. Hvis employee
og department
er ikke heltal, cast til den matchende type.
Per kommentar fra @ypercube:count() skal være på en ikke-nul kolonne med items
, så vi får 0
for ikke-eksisterende kriterier, ikke 1
.
Træk også yderligere kriterier op i LEFT JOIN
betingelse (i.available
i dette tilfælde), så du ikke udelukker ikke-eksisterende kriterier.
Ydeevne
Besvarelse af yderligere spørgsmål i kommentarfeltet.
Dette burde fungere meget godt. Med længere lister over kriterier, (LEFT) JOIN
er nok den hurtigste metode.
Hvis du har brug for det så hurtigt som muligt, skal du sørge for at oprette en multicolumn indeks som:
CREATE INDEX items_some_name_idx ON items (employee, department);
Hvis (employee, department)
skal være den PRIMARY KEY
eller du skal have en UNIQUE
begrænsning på de to kolonner, det ville også gøre det trick.