PostgreSQL 中的行到列
Rows to columns in PostgreSQL
我有以下主要内容table:
order_id unique_order_id article_price
1 1A 100
1 1B 200
1 1C 300
2 2A 100
我希望得到以下结果:
order_id article_priceA article_priceB article_priceC
1 100 200 300
2 100 null null
我找到了一个解决方案,通过对每个 unique_order 进行主 table 的自连接(我将每个 order_id 最多有 4 个不同的唯一订单(A,B ,C,D),不过我想知道是否有更好的方法来做到这一点?
我目前的解决方案是这样的:
select
a.order_id,
a.article_price as article_priceA,
b.article_price as article_priceB,
c.article_price as article_priceC
from main a
left join main b on b.order_id=a.order_id and right(unique_order_id,1)='B'
left join main c on b.order_id=a.order_id and right(unique_order_id,1)='C
您可以为此使用条件聚合:
select order_id,
max(case when right(unique_order_id, 1) = 'A' then article_price end) as article_priceA,
max(case when right(unique_order_id, 1) = 'B' then article_price end) as article_priceB,
max(case when right(unique_order_id, 1) = 'C' then article_price end) as article_priceC
from main
group by order_id;
我有以下主要内容table:
order_id unique_order_id article_price
1 1A 100
1 1B 200
1 1C 300
2 2A 100
我希望得到以下结果:
order_id article_priceA article_priceB article_priceC
1 100 200 300
2 100 null null
我找到了一个解决方案,通过对每个 unique_order 进行主 table 的自连接(我将每个 order_id 最多有 4 个不同的唯一订单(A,B ,C,D),不过我想知道是否有更好的方法来做到这一点?
我目前的解决方案是这样的:
select
a.order_id,
a.article_price as article_priceA,
b.article_price as article_priceB,
c.article_price as article_priceC
from main a
left join main b on b.order_id=a.order_id and right(unique_order_id,1)='B'
left join main c on b.order_id=a.order_id and right(unique_order_id,1)='C
您可以为此使用条件聚合:
select order_id,
max(case when right(unique_order_id, 1) = 'A' then article_price end) as article_priceA,
max(case when right(unique_order_id, 1) = 'B' then article_price end) as article_priceB,
max(case when right(unique_order_id, 1) = 'C' then article_price end) as article_priceC
from main
group by order_id;