Postgresql 如何透视表以显示两个独立的列

Postgresql 如何透视表以显示两个独立的列,postgresql,pivot,metabase,Postgresql,Pivot,Metabase,(我的数据库向我展示了每个人以及他们有多少支出,以及他们在哪个阶段有——f.y.i并非每个人都有全部4笔支出) 我创建了一个表,其中包含了不同阶段的平均值,称为支付1、支付2、支付3和支付4 每个阶段都有一个支付金额,并且有多个人获得不同的支付金额 我现在有一个问题来透视这个表,这样我就可以有两列,分别是支付阶段和平均值。我需要这个,这样我就可以在metabase中将它用作条形图可视化 我已经到了可以轻松显示平均值的阶段(见下文) 结果是我看到了每个支出的平均值(yay),但是现在我想要有两列,

(我的数据库向我展示了每个人以及他们有多少支出,以及他们在哪个阶段有——f.y.i并非每个人都有全部4笔支出)

我创建了一个表,其中包含了不同阶段的平均值,称为支付1、支付2、支付3和支付4

每个阶段都有一个支付金额,并且有多个人获得不同的支付金额

我现在有一个问题来透视这个表,这样我就可以有两列,分别是支付阶段和平均值。我需要这个,这样我就可以在metabase中将它用作条形图可视化

我已经到了可以轻松显示平均值的阶段(见下文)

结果是我看到了每个支出的平均值(yay),但是现在我想要有两列,1表示支出类型,2表示支出类型。平均支付金额

这是我的结果:

|------------------|---------------|---------------|---------------|
|   avg_payout_1   |  avg_payout_2 |  avg_payout_3 |  avg_payout_4 |
|------------------|---------------|---------------|---------------|
|       34.32      |      145.11   |     78.65     |      96.76    |
|------------------|---------------|---------------|---------------|
我希望它能显示:

|------------------|---------------|
|      payout      |      avg      |  
|------------------|---------------|
|     payout_1     |      34.32    | 
|------------------|---------------|
|     payout_2     |      145.11   | 
|------------------|---------------|

etc

如果只有这4列,则可以将这些值组成一个数组,然后将它们拆分为行,如:

select
unnest(array [a1,a2,a3,a4]),
unnest(array ['avg_payout_1','avg_payout_2','avg_payout_3','avg_payout_4'])
from(
select 
    round(avg(payout_1)::numeric,2) a1,
    round(avg(payout_2)::numeric,2) a2,
    round(avg(payout_3)::numeric,2) a3,
    round(avg(payout_4)::numeric,2) a4
    from payout_table) a

这不是一个外观最好的解决方案,但它很有效。

如果只有这4列,则可以将这些值组成一个数组,然后将它们拆分为行,如:

select
unnest(array [a1,a2,a3,a4]),
unnest(array ['avg_payout_1','avg_payout_2','avg_payout_3','avg_payout_4'])
from(
select 
    round(avg(payout_1)::numeric,2) a1,
    round(avg(payout_2)::numeric,2) a2,
    round(avg(payout_3)::numeric,2) a3,
    round(avg(payout_4)::numeric,2) a4
    from payout_table) a
这不是一个外观最好的解决方案,但它很有效。

使用
unnest()

jsonb

select key as payout, value::numeric as avg
from (
    select
        round(avg(payout_1)::numeric,2) as payout_1,
        round(avg(payout_2)::numeric,2) as payout_2,
        round(avg(payout_3)::numeric,2) as payout_3,
        round(avg(payout_4)::numeric,2) as payout_4
    from payout_table
    ) s
cross join jsonb_each(to_jsonb(s))

使用
unest()

jsonb

select key as payout, value::numeric as avg
from (
    select
        round(avg(payout_1)::numeric,2) as payout_1,
        round(avg(payout_2)::numeric,2) as payout_2,
        round(avg(payout_3)::numeric,2) as payout_3,
        round(avg(payout_4)::numeric,2) as payout_4
    from payout_table
    ) s
cross join jsonb_each(to_jsonb(s))

请添加样本数据和预期output@S-老兄,我刚刚添加了它,感谢您这么快的评论,请添加示例数据和预期结果output@S-老兄,我刚刚添加了它,谢谢你这么快的评论