CASE別の、わずかに短いバリアント (パフォーマンスはステートメントの場合とほぼ同じです):
SELECT pc.dist_id, pc.route, pc.types
,COUNT(NULLIF(pc.types = '$type', FALSE) AS total
,COUNT(NULLIF(pc.types = '$type' AND pc.options = '1', FALSE) AS callbacks
FROM per_call pc
WHERE pc.types = '$type'
GROUP BY pc.dist_id, pc.route, pc.types
ORDER BY pc.dist_id, pc.route;
その背後にあるプリンシパルは次のとおりです
COUNT。null 以外のすべての値をカウントします。式は、 、または
のブール値を生成します。ケース
をカウントするだけです。
に変換すると、すべてがグルーヴィーになります。TRUEFALSENULL
TRUE
FALSENULL
または、さらに短くなりますが、速くはありません:
SELECT pc.dist_id, pc.route, pc.types
,sum((pc.types = '$type')::int) AS total
,sum((pc.types = '$type' AND pc.options = '1')::int) AS callbacks
FROM per_call pc
WHERE pc.types = '$type'
GROUP BY pc.dist_id, pc.route, pc.types
ORDER BY pc.dist_id, pc.route;
に強制booleanするとinteger、TRUE1 に変換され、FALSE0 に変換されます。したがって、sum()機能します。
pc.types = '$type'as条件があるのでWHERE、次のように簡略化できます。
SELECT pc.dist_id, pc.route, pc.types
,COUNT(*) AS total -- slightly faster, too
,COUNT(NULLIF(pc.options = '1', FALSE) AS callbacks
FROM per_call pc
WHERE pc.types = '$type'
GROUP BY pc.dist_id, pc.route, pc.types
ORDER BY pc.dist_id, pc.route;