如何使用Postgres SQL将行转换为列?

如何使用Postgres SQL将行转换为列?,sql,postgresql,pivot,crosstab,postgresql-9.4,Sql,Postgresql,Pivot,Crosstab,Postgresql 9.4,我有以下结构中的数据 所需输出 您只需按customer_id进行分组,并在其自己的列中选择每个值。出于语法上的原因,您需要在各个values列上使用聚合函数,这就是为什么每个列都有一个Max函数 当然,不是说以规范化的方式存储数据会更好。此外,对于较新版本的postgres,您可以使用filter而不是case,我发现它更具可读性。postgres(从9.4开始)支持条件聚合的filter语法。因此,我建议: SELECT customer_id, MAX(value) FI

我有以下结构中的数据

所需输出

您只需按customer_id进行分组,并在其自己的列中选择每个值。出于语法上的原因,您需要在各个values列上使用聚合函数,这就是为什么每个列都有一个Max函数

当然,不是说以规范化的方式存储数据会更好。此外,对于较新版本的postgres,您可以使用filter而不是case,我发现它更具可读性。

postgres(从9.4开始)支持条件聚合的
filter
语法。因此,我建议:

SELECT customer_id,
       MAX(value) FILTER (WHERE name = 'age') as age,
       MAX(value) FILTER (WHERE name = 'marketing_consent') as marketing_consent,
       MAX(value) FILTER (WHERE name = 'gender') as gender
FROM t
GROUP BY customer_id

为什么使用MySQL标签?
SELECT customer_id,
       MAX(value) FILTER (WHERE name = 'age') as age,
       MAX(value) FILTER (WHERE name = 'marketing_consent') as marketing_consent,
       MAX(value) FILTER (WHERE name = 'gender') as gender
FROM t
GROUP BY customer_id