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