【发布时间】:2017-05-23 09:33:09
【问题描述】:
我在 Postgres 中有一个表,旨在以非结构化形式捕获信息并重建它。从该表中导出数据时,我需要重新应用一些结构并且正在苦苦挣扎。
目前,我有一个表格:
lbl | name | value
----|------------|--------
1 | num | 1
1 | colour | "Red"
1 | percentage | 25.0
2 | num | 2
2 | colour | "Green"
2 | percentage | 50.0
3 | num | 3
3 | colour | "Blue"
3 | percentage | 75.0
而且我需要以这种形式生成一个表格:
lbl | num | colour | percentage
----|-----|---------|------------
1 | 1 | "Red" | 25.0
2 | 2 | "Green" | 50.0
3 | 3 | "Blue" | 75.0
我已经建立了这个查询:
SELECT lbl,
max(case when name = 'num' then value else '-' end) num,
max(case when name = 'colour' then value else '-' end) colour,
max(case when name = 'percentage' then value else '-' end) percentage
FROM example_table
GROUP BY lbl
查询有效,但我需要将其扩展为包含任意数量的潜在名称值。我已经调查过 crossfunc 但无法让它按我的意图工作。任何帮助将不胜感激。
我在这里设置了一个 sqlfiddle 来帮助启动:http://sqlfiddle.com/#!9/8d3133/6/0
编辑:如果可以的话,我也可以使用 PL/pgSQL。
【问题讨论】:
-
我觉得这里需要使用动态SQL。
-
“为名称包含任意数量的潜在值”,这在普通 SQL 中是不可能的。数据库在运行查询之前必须知道查询的列数。
-
啊,好的。如果我可以使用 plsql 可以吗?
-
我认为那里有几个链接,我也许可以找到答案。他们中的大多数似乎都没有处理我有任意多个“名称”值的情况。对于一个已知的值,即使是一个很大的值,这似乎很容易,但就我而言,我不提前知道这些值是什么。
标签: sql postgresql pivot crosstab