Omöjligt? Utmaning accepterad. :)
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;
Detta ger dig exakt vad du efterfrågar. Om employee
och department
är inte heltal, cast till den matchande typen.
Per kommentar från @ypercube:count() måste finnas på en icke-null kolumn med items
, så vi får 0
för icke-existerande kriterier, inte 1
.
Dra också upp ytterligare kriterier i LEFT JOIN
skick (i.available
i det här fallet), så att du inte utesluter icke-existerande kriterier.
Prestanda
Besvarar ytterligare frågor i kommentaren.
Detta borde fungera mycket bra. Med längre listor med kriterier, (LEFT) JOIN
är förmodligen den snabbaste metoden.
Om du behöver det så snabbt som möjligt, se till att skapa en flerkolumn index gillar:
CREATE INDEX items_some_name_idx ON items (employee, department);
Om (employee, department)
ska vara PRIMARY KEY
eller så bör du ha en UNIQUE
begränsning på de två kolumnerna, det skulle också göra susen.