如何旋转我的 table 以显示两个单独的列

How do I pivot my table to show two separate columns

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

我创建了一个 table 不同阶段的平均值,称为支出 1、支出 2、支出 3 和支出 4。

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

我现在有一个问题来调整这个 table 以便我可以有 2 列包含支出阶段和平均值。我需要这个,以便我可以将其用作配置数据库中的条形图可视化。

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

select 
    round(avg(payout_1)::numeric,2) as avg_payout_1,
    round(avg(payout_2)::numeric,2) as avg_payout_2,
    round(avg(payout_3)::numeric,2) as avg_payout_3,
    round(avg(payout_4)::numeric,2) as avg_payout_4
    from payout_table

结果是我看到了每次支付的平均值 (yay) 但是现在我想要 2 列,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   | 
|------------------|---------------|

等等

如果您只有这 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():

select 
    unnest(array[
        'payout_1', 
        'payout_2', 
        'payout_3', 
        'payout_4']) as payout,
    unnest(array[
        round(avg(payout_1)::numeric,2),
        round(avg(payout_2)::numeric,2),
        round(avg(payout_3)::numeric,2),
        round(avg(payout_4)::numeric,2)]) as avg
from payout_table

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

Db<>fiddle