ありえない?勝負を受けて立つ。 :)
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つの列に制約を課すと、それでもうまくいきます。