Вы ищете перекрестную таблицу или сводную таблицу. Я добавил теги.
Однако:
если я не знаю, сколько существует типов, и не могу конкретно перечислить все случаи, как я могу этого добиться?
В принципе это невозможно в одном SQL-запросе, потому что SQL требует знать количество столбцов результатов во время вызова. Он не может вернуть динамическое количество столбцов в принципе.
Существуют различные обходные пути с полиморфными типами или с типом документа, таким как json
, jsonb
, hstore
или xml
, или с возвращаемыми массивами вместо отдельных столбцов...
Но чтобы получить именно то, что вы просите, неизвестное количество выделенных столбцов, вам нужен двухэтапный рабочий процесс. Нравиться:
- Создайте запрос динамически (определив тип возвращаемого значения).
- Выполните это.
Связанный:
Тем не менее, если ваш случай простой и вы имеете дело с кучей известных типов, вы можете просто предоставить лишнее. С более быстрым запросом crosstab()
или с простой условной агрегацией, как у вас, просто более элегантной и эффективной с предложением агрегата FILTER
:
SELECT count(*) FILTER (WHERE type = 'A') AS type_a
, count(*) FILTER (WHERE type = 'B') AS type_b
, count(*) FILTER (WHERE type = 'C') AS type_c
, count(*) FILTER (WHERE type = 'D') AS type_d
-- that's all folks!
FROM tbl;
Типы без записей сообщают 0
(count()
никогда не возвращает NULL
), что в любом случае было бы правильным.
Не работает для неизвестных типов, очевидно.
person
Erwin Brandstetter
schedule
17.04.2021