i’m not really much of an expert when it comes to databases and i was wondering if it’s possible to do something which might be a little weird
I’m having a simple table called options which has 3 columns : id(PK), user_id(FK), option
The table looks like this:
Is is possible to write a query that breaks the option column into multiple columns for each user_id?For example, looking at the photo it would be something like this:
user_id | option1 | option2 | option3 1 5 4 2 2 7 2
I need to get the data like this because it would be easier to export it in a text file using java
Advertisement
Answer
Yes, you can do that with an extension called tablefunc
.
Documentation https://www.postgresql.org/docs/10/tablefunc.html
Example
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);
List out extensions we currently have:
# dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+------------------------------ plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
Add tablefunc
extension
# 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
Great, now the extension is available. Let’s write the query
Query
select * from crosstab('select user_id, id, option from test order by 1, 2') as (user_id int, option1 int, option2 int, option3 int);
Result
user_id | option1 | option2 | option3 ---------+---------+---------+--------- 1 | 5 | 4 | 2 2 | 7 | 2 |
Hope this helps.
Limitation
The limitation is that it does not create columns automatically. However, you can write a stored function that reads the maximum number of columns to generate and dynamically creates a query, and executes it.