W Postgresie 9.4 lub nowszym użyj agregatu FILTER
opcja. Zazwyczaj najczystszy i najszybszy:
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;
Szczegóły dotyczące FILTER
klauzula:
- Agregacja kolumn z dodatkowymi (odrębnymi) filtrami
Jeśli chcesz to krótkie :
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;
Więcej wariantów składni:
- Aby uzyskać bezwzględną wydajność, czy SUM jest szybszy czy COUNT?
Właściwe zapytanie krzyżowe
crosstab()
zapewnia najlepszą wydajność i jest krótszy w przypadku długich list opcji:
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);
Szczegółowe wyjaśnienie:
- Kwerendy PostgreSQL Crosstab