2
$SQL = "SELECT pc.dist_id, pc.route, pc.types,
        COUNT( pc.types = '$type' ) total,
        COUNT( pc.types = '$type' AND pc.options = '1') 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が()内の複数の列でどのように機能するかを尋ねていると思います。

4

2 に答える 2

1

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するとintegerTRUE1 に変換され、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;
于 2012-12-26T06:27:51.517 に答える