在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
使用交叉表这很简单 . 但我想要以下规格:
-
天列将是动态的 . 有时增量为1,2,3(天),0,30,60天(会计月),有时为360,720(会计年) .
-
天的范围将是动态的 . (例如,0..500天对比1..10天) .
-
前两列是静态的(id和extra_col)
-
所有动态列的返回类型将保持相同的类型(在此示例中为
integer
)
以下是我探索过的解决方案,由于以下原因,这些解决方案都不适用于我:
-
Automatically creating pivot table column names in PostgreSQL - 需要两次前往数据库 .
-
Using crosstab_hash - 不是动态的
从我探索过的所有解决方案中,似乎唯一一个允许在一次数据库中发生这种情况的解决方案需要运行三次相同的查询 . 有没有办法将查询存储为 crosstab
函数中的 CTE
?
SELECT *
FROM
CROSSTAB(
--QUERY--,
$$--RUN QUERY AGAIN TO GET NUMBER OF COLUMNS--$$
)
as ct (
--RUN QUERY AGAIN AND CREATE STRING OF COLUMNS WITH TYPE--
)
1 回答
基于任何构建功能的每个解决方案都需要知道许多输出列 . PostgreSQL规划师需要它 . 有基于游标的解决方法 - 它只是一种方式,如何从Postgres获得真正动态的结果 .
该示例相对较长且不可读(SQL实际上不支持交叉制表),因此我不会在此处重写来自博客的代码http://okbob.blogspot.cz/2008/08/using-cursors-for-generating-cross.html .