Да, вы можете сделать это с помощью расширения, называемого tablefunc
.
Документация https://www.postgresql.org/docs/10/tablefunc.html
Пример
create table test (id int, user_id int, option int);
insert into test values (1,1,5), (2,1,4), (3,1,2,), (4,2,7), (5,2,2);
Перечислите расширения, которые у нас есть:
# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
Добавить tablefunc
расширение
# create extension tablefunc;
CREATE EXTENSION
# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+------------+------------------------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
tablefunc | 1.0 | public | functions that manipulate whole tables, including crosstab
Отлично, теперь расширение доступно.Давайте напишем запрос
Запрос
select *
from crosstab('select user_id, id, option from test order by 1, 2')
as (user_id int, option1 int, option2 int, option3 int);
Результат
user_id | option1 | option2 | option3
---------+---------+---------+---------
1 | 5 | 4 | 2
2 | 7 | 2 |
Надеюсь, это поможет.
Ограничение
Ограничение заключается в том, что он не создает столбцы автоматически.Однако вы можете написать хранимую функцию, которая считывает максимальное количество столбцов для генерации, динамически создает запрос и выполняет его.