将列的不同值转换为postgres行

时间:2018-04-12 09:57:33

标签: sql postgresql pivot crosstab

我有一个类似的架构:

 [ad_id] . [name] . [valueofname]
   1 .       name .   "brian"
   1 .       age  .    "23"
   2 .       job  .    "IT"
   2 .       name .    "Jack"  

行名称包含多个值:agenamebirthdayjobage 我想把它转换成这个:

[ad_id] .   [name]  .      [age] .      [birthday] .    [job]
         [valueofname] [valueofname] [valueofname] [valueofname]

我已经为每一行完成了查询:

select * from where name='name'
select * from where name='age'
select * from where name='job'

我看到了示例SQL Server : Columns to Rows。但这与我的问题相反。

您是否有任何关于在性能方面制作可扩展查询的建议?

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

select ad_id,
       max(case when name = 'name' then valueofname end) as name,
       max(case when name = 'age' then valueofname end) as age,
       max(case when name = 'birthday' then valueofname end) as birthday,
       max(case when name = 'job' then valueofname end) as job
from t
group by ad_id;

在SQL Server中,您还可以使用pivot执行类似操作。