В 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 Crosstab Query