动态生成Postgres交叉表的AS子句

时间:2013-05-22 10:30:44

标签: postgresql pivot crosstab

这实际上是Dynamically generate columns for crosstab in PostgreSQL

的后续行动

要明确:如果我的数据集具有可变数量的键,我就无法生成AS子句?

EG。 最初与学生(汤姆,迪克,哈利)进行测试(测试,学生,结果)的表格

这个交叉表将是:

select * from crosstab(
'select testdate, pupil, result from tests)',
'select distinct pupil from tests order by pupil')
as ct
(  
"testdate" text,
"Dick" text,
"Harry" text,
"Tom" text)

Sally加入后会失败吗?有点像

ERROR:  invalid return type
DETAIL:  Query-specified return tuple has 4 columns but crosstab returns 5.

1 个答案:

答案 0 :(得分:0)

PostgreSQL需要在规划期间了解返回类型和结构,因此您无法直接返回动态数量的列。通常,您希望执行以下两项操作之一:

1:限制结果

这种方法类似于:

select * from crosstab(
'select testdate, pupil, result from tests)',
'select distinct pupil from tests where pupil in (''Dick'', ''Harry'', ''Tom'') order by pupil')
as ct
(  
"testdate" text,
"Dick" text,
"Harry" text,
"Tom" text)

那样,莎莉出现时就找不到了。

2:返回文本refcursor,json或xml

另一种方法是返回一个可以存储各种数据的类型,然后在动态计算返回列的函数或存储过程中执行这些数据。这稍微复杂一点,因此这里的问题不是真正的问题。有关详细信息,请参阅PL / PGSQL函数。

关键是你需要将每一行作为单个实体返回。您可以使用行表示法,或者您可以返回一个refcursor(在同一事务中应用程序中必须是FETCHED,请注意这与pgAdmin不兼容),或者您需要返回JSON或XML类型。请注意,根据您的PostgreSQL版本(JSON需要PostgreSQL 9.1或更高版本,可能带有插件),行可以转换为JSON和XML而不会有太多麻烦。

相关问题