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 以外のすべての値をカウントします。式は、 、または
のブール値を生成します。ケース
をカウントするだけです。
に変換すると、すべてがグルーヴィーになります。TRUE
FALSE
NULL
TRUE
FALSE
NULL
または、さらに短くなりますが、速くはありません:
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
、TRUE
1 に変換され、FALSE
0 に変換されます。したがって、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;