使用generate_series的动态交叉表

时间:2016-05-29 14:11:48

标签: postgresql postgresql-9.1 crosstab

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

此“STATIC”查询按预期工作:

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))

生成与上述相同的文字。使用此“DYNAMIC”查询替换此“STATIC”文本不起作用:

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,

1 个答案:

答案 0 :(得分:0)

这里的问题是规划人员在计划之前需要知道行大小。所以你有几个选择:

  1. 选择列表并使用客户端语言或
  2. 动态生成查询
  3. 选择列表并以服务器端非SQL语言动态生成查询(plpgsql或plperl将是我的选择)。
  4. 现在,第一个更干净,因为第二个只是改变了问题所以你可能不得不返回一个refcursor并从中获取,因为计划者在返回之前需要知道函数的输出。 / p>