Non possibile? Sfida accettata. :)
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;
Questo ti darà esattamente quello che stai chiedendo. Se employee
e department
non sono interi, esegui il cast nel tipo corrispondente.
Per commento di @ypercube:count() deve trovarsi su una colonna non nulla di items
, quindi otteniamo 0
per criteri inesistenti, non 1
.
Inoltre, richiama criteri aggiuntivi in LEFT JOIN
condizione (i.available
in questo caso), quindi non escludi criteri inesistenti.
Prestazioni
Affrontare ulteriori domande nel commento.
Questo dovrebbe funzionare molto bene. Con elenchi di criteri più lunghi, (LEFT) JOIN
è probabilmente il metodo più veloce.
Se ne hai bisogno il più velocemente possibile, assicurati di creare una multicolonna indice come:
CREATE INDEX items_some_name_idx ON items (employee, department);
Se (employee, department)
dovrebbe essere la PRIMARY KEY
oppure dovresti avere un UNIQUE
vincolo sulle due colonne, anche questo farebbe il trucco.