Rod*_*uss 6 sql postgresql crosstab
我有一个视图,产生以下结果集:
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);
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为:
client_id a0_cur_val a0_fut_val a1_cur_val a1_fut_val ...
1 10 20 5 10
2 NULL NULL 0 2
Run Code Online (Sandbox Code Playgroud)
如果我只使用current_value列,使用交叉表,我知道如何做到这一点.如何在目标结果集中使用current_value和future_value生成新列?如果我只是future_value在crosstab(text)查询中添加列,则会抱怨"源数据SQL语句无效".
我正在使用PostgreSQL 9.3.6.
一种方法是使用复合类型:
CREATE TYPE i2 AS (a int, b int);
Run Code Online (Sandbox Code Playgroud)
或者,对于临时使用(在会话期间注册类型):
CREATE TEMP TABLE i2 (a int, b int);
Run Code Online (Sandbox Code Playgroud)
然后运行您知道的交叉表并分解复合类型:
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);
Run Code Online (Sandbox Code Playgroud)
所有括号都是必需的!
基础知识crosstab():
| 归档时间: |
|
| 查看次数: |
2788 次 |
| 最近记录: |