Postgres 9.4以降では、集約FILTER
を使用します オプション。通常、最もクリーンで最速です:
SELECT category
, count(*) FILTER (WHERE question1 = 0) AS zero
, count(*) FILTER (WHERE question1 = 1) AS one
, count(*) FILTER (WHERE question1 = 2) AS two
FROM reviews
GROUP BY 1;
FILTER
の詳細 条項:
- 追加の(個別の)フィルターを使用して列を集約します
必要に応じて短い :
SELECT category
, count(question1 = 0 OR NULL) AS zero
, count(question1 = 1 OR NULL) AS one
, count(question1 = 2 OR NULL) AS two
FROM reviews
GROUP BY 1;
その他の構文バリアント:
- 絶対的なパフォーマンスのために、SUMは高速ですか、それともCOUNTですか?
適切なクロス集計クエリ
crosstab()
最高のパフォーマンスが得られ、オプションの長いリストの場合は短くなります:
SELECT * FROM crosstab(
'SELECT category, question1, count(*) AS ct
FROM reviews
GROUP BY 1, 2
ORDER BY 1, 2'
, 'VALUES (0), (1), (2)'
) AS ct (category text, zero int, one int, two int);
詳細な説明:
- PostgreSQLクロス集計クエリ