gpt4 book ai didi

sql - 具有多个值列的数据透视表/交叉表

转载 作者:行者123 更新时间:2023-11-29 11:24:22 24 4
gpt4 key购买 nike

我有一个生成以下结果集的 View :

CREATE TABLE foo
AS
SELECT client_id, asset_type, current_value, future_value
FROM ( VALUES
( 1, 0, 10 , 20 ),
( 1, 1, 5 , 10 ),
( 1, 2, 7 , 15 ),
( 2, 1, 0 , 2 ),
( 2, 2, 150, 300 )
) AS t(client_id, asset_type, current_value, future_value);

我需要把它变成这样:

client_id    a0_cur_val   a0_fut_val  a1_cur_val  a1_fut_val  ...
1 10 20 5 10
2 NULL NULL 0 2

如果我使用交叉表仅使用 current_value 列,我知道如何做到这一点。如何使用 current_valuefuture_value 在目标结果集中生成新列?如果我只是将 future_value 列添加到 crosstab(text) 查询中,它会提示“无效的源数据 SQL 语句”。

我正在使用 PostgreSQL 9.3.6。

最佳答案

一种方法是使用复合类型:

CREATE TYPE i2 AS (a int, b int);

或者,对于临时使用(在 session 期间注册类型):

CREATE TEMP TABLE i2 (a int, b int);

然后运行你所知道的交叉表并分解复合类型:

SELECT client_id
, (a0).a AS a0_cur_val, (a0).b AS a0_fut_val
, (a1).a AS a1_cur_val, (a1).b AS a1_fut_val
, (a2).a AS a2_cur_val, (a2).b AS a2_fut_val
FROM crosstab(
'SELECT client_id, asset_type, (current_value, future_value)::i2
FROM foo
ORDER BY 1,2'

,'SELECT * FROM generate_series(0,2)'
) AS ct (client_id int, a0 i2, a1 i2, a2 i2);

所有括号都是必需的!

crosstab() 的基础知识:

关于sql - 具有多个值列的数据透视表/交叉表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com