使用generate_series的动态交叉表

问题描述:

尝试使用generate_series执行动态交叉表。但没有运气。使用generate_series的动态交叉表

这种“静态”查询按预期工作:

SELECT * FROM crosstab(
$$ SELECT DISTINCT ON(sign,date) sign,date,sum(hr) FROM hr $$, 
$$ SELECT * FROM(SELECT to_char(generate_series('2014-01-01','2014-01-05', interval '1 day'),'YYYY-MM-DD') date)date$$) 
as ct (sign text,"2014-01-01" text,"2014-01-02" text,"2014-01-03" text,"2014-01-04" text,"2014-01-05" text) 

最后这部分我想用一个动态查询,以取代:

sign text,"2014-01-01" text,"2014-01-02" text,"2014-01-03" text,"2014-01-04" text,"2014-01-05" text 

我已经设法这创造

SELECT concat('sign text,',(SELECT string_agg(col,',') from(select to_char(generate_series('2015-01-01','2015-01-05', interval '1 day'),'\"YYYY-MM-DD\" text')col)cols)) 

它生成与上面相同的文本。这种 “动态” 查询更换这种 “静态” 文本不起作用:在

SELECT * FROM crosstab(
$$ SELECT DISTINCT ON(sign,date) sign,date,sum(hr) FROM hr $$, 
$$ SELECT * FROM(SELECT to_char(generate_series('2014-01-01','2014-01-05', interval '1 day'),'YYYY-MM-DD') date)date$$) 
as ct (SELECT concat('sign text,',(SELECT string_agg(col,',') from(SELECT to_char(generate_series('2015-01-01','2015-01-05', interval '1 day'),'\"YYYY-MM-DD\" text')col)cols))) 

语法错误或接近 “SELECT”

为什么?任何提示如何以简单的方式做到这一点动态? (优选不使用功能)

TIA,

+0

无法使用函数来执行动态构造的SQL是不可能的。 – Abelisto

这里的问题是,策划者需要知道之前规划的行大小。所以,你有几种选择:

  1. 选择列表和动态生成客户端语言或查询
  2. 选择列表和动态生成的服务器端非SQL语言查询(PLPGSQL或plperl将是我的选择)。

现在,首先是因为清洁第二只是转移问题,所以你可能要返回一个refcursor和因为规划需要返回之前知道函数的输出从获取。