在Postgres 9.4中,我有一个这样的表:
id extra_col days value
-- --------- --- -----
1 rev 0 4
1 rev 30 5
2 cost 60 6
我想要这个透视结果
id extra_col 0 30 60
-- --------- -- -- --
1 rev 4 5
2 cost 6
使用交叉表很简单。 但我想要以下规格:
integer
)以下是我探索过的解决方案,由于以下原因,这些解决方案都不适用于我:
从我探索过的所有解决方案中,似乎唯一一个允许在一次数据库中发生这种情况的解决方案需要运行三次相同的查询。有没有办法将查询存储为CTE
函数中的crosstab
?
SELECT *
FROM
CROSSTAB(
--QUERY--,
$$--RUN QUERY AGAIN TO GET NUMBER OF COLUMNS--$$
)
as ct (
--RUN QUERY AGAIN AND CREATE STRING OF COLUMNS WITH TYPE--
)
答案 0 :(得分:1)
基于任何构建功能的每个解决方案都需要知道许多输出列。 PostgreSQL规划师需要它。有基于游标的解决方法 - 它只是一种方式,如何从Postgres获得真正动态的结果。
该示例相对较长且不可读(SQL实际上不支持交叉制表),因此我不会在此处重写来自博客的代码http://okbob.blogspot.cz/2008/08/using-cursors-for-generating-cross.html。