I have data like the following:
create temp table codes (id integer, code text);
insert into codes (id, code) values
(1, 'code_1'),
(1, 'code_2'),
(2, 'code_2'),
(3, 'code_1');
In order to facilitate a select that joins on the id field, I'd like to pivot this table using crosstab, so that each id value is unique. So far I have this design, which works for a single code value:
select *
from crosstab($$
select id, code, case when code = 'code_1' then true else false end
from codes
order by 1,2
$$) as codes(id int, is_code_1 boolean);
Correct output:
id | is_code_1
----+-----------
1 | t
2 | f
3 | t
(3 rows)
I'd like to be able to extend this to multiple code values so that I end up with output like this:
id | is_code_1 | is_code_2
----+-----------+-----------
1 | t | t
2 | f | t
3 | t | f
Not sure this is possible, but would be very happy to learn otherwise.
Edit: This gets me really close to the desired outcome, may provide it as an answer because I can use it to solve me problem. Thanks @Daniel Vérité for the link to 2 parameter crosstab.
select *
from crosstab(
$$
select id, code, case when code is not null then true else false end
from codes
order by 1,2
$$,
$$values ('code_1'), ('code_2')$$
) as codes(id int, code_1 boolean, code_2 boolean);
Produces:
id | code_1 | code_2
----+--------+--------
1 | t | t
2 | | t
3 | t |
So nulls instead of boolean false values, but I can work with that.