行名称

时间:2017-09-12 23:47:09

标签: postgresql crosstab

我有以下数据:

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');

为了方便连接id字段的select,我想使用交叉表来旋转这个表,这样每个id值都是唯一的。到目前为止,我有这个设计,它适用于单个代码值:

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);

正确输出:

 id | is_code_1
----+-----------
  1 | t
  2 | f
  3 | t
 (3 rows)

我希望能够将其扩展为多个代码值,以便最终得到如下输出:

 id | is_code_1 | is_code_2
----+-----------+-----------
  1 | t         | t
  2 | f         | t
  3 | t         | f

不确定这是可能的,但非常乐意另外学习。

修改: 这让我非常接近理想的结果,可以提供它作为答案,因为我可以用它来解决我的问题。感谢@DanielVérité链接到2参数交叉表。

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);

产地:

 id | code_1 | code_2
----+--------+--------
  1 | t      | t
  2 |        | t
  3 | t      |

所以nulls而不是boolean false值,但我可以使用它。

1 个答案:

答案 0 :(得分:0)

不确定我是否理解正确,但此代码可能会回答您的问题:

select *
  from crosstab($$
  select id, code, case when code = 'code_1' then true  
                          when code = 'code_2' then true else false  end
  from codes
  order by 1,2
$$) as codes(id int, is_code_1 boolean, is_code_2 boolean);