ありえない?勝負を受けて立つ。 :)
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;
これにより、正確に あなたが求めているもの。 employeeの場合 およびdepartment 整数ではなく、一致するタイプにキャストされます。
@ypercubeからのコメントごと:count()はitemsのnull以外の列にある必要があります 、したがって、0を取得します 1ではなく、存在しない基準の場合 。
また、追加の基準をLEFT JOINにプルアップします 状態(i.available この場合)、存在しない基準を除外しないでください。
パフォーマンス
コメントで追加の質問に対処します。
これは非常にうまく機能するはずです。基準のリストが長い場合は、(LEFT) JOIN おそらく最速の方法です。
できるだけ早く必要な場合は、必ずmulticolumnを作成してください。インデックス のように:
CREATE INDEX items_some_name_idx ON items (employee, department);
(employee, department)の場合 PRIMARY KEYである必要があります または、UNIQUEが必要です 2つの列に制約を課すと、それでもうまくいきます。