Postgres值为列

时间:2014-04-09 11:31:29

标签: postgresql pivot crosstab

我正在使用PostgreSQL 9.3,我有这个:

PARENT_TABLE

ID | NAME
1  | N_A
2  | N_B
3  | N_C

CHILD_TABLE

ID | PARENT_TABLE_ID | KEY | VALUE
1  | 1               | K_A | V_A
2  | 1               | K_B | V_B
3  | 1               | K_C | V_C
5  | 2               | K_A | V_D
6  | 2               | K_C | V_E
7  | 3               | K_A | V_F
8  | 3               | K_B | V_G
9  | 3               | K_C | V_H

请注意,我可能会在KEY中添加K_D,它完全是动态的。

我想要的是一个返回以下内容的查询:

QUERY_TABLE

ID | NAME | K_A | K_B | K_C | others K_...
1  | N_A  | V_A | V_B | V_C | ...
2  | N_B  | V_D |     | V_E | ...
3  | N_C  | V_F | V_G | V_H | ...

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

由于可能缺少值,因此您需要" safe" crosstab()的形式,列名为第二个参数:

SELECT * FROM crosstab(
       'SELECT p.id, p.name, c.key, c."value"
        FROM   parent_table p
        LEFT   JOIN child_table c ON c.parent_table_id = p.id
        ORDER  BY 1'

      ,$$VALUES ('K_A'::text), ('K_B'), ('K_C')$$)
AS t (id int, name text, k_a text, k_b text, k_c text;  -- use actual data types

此相关答案的详情:
PostgreSQL Crosstab Query

关于添加"额外"列:
Pivot on Multiple Columns using Tablefunc