2016-05-29 7 views
0

generate_seriesを使用して動的クロス集計を実行しようとしています。しかし、運がない。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、

+0

関数を使用せずに動的に構築されたSQLを実行することはできません。 – Abelisto

答えて

0

ここでの問題は、プランナーは、計画の前に行サイズを知っておく必要があるということです。だから、いくつかのオプションがあります:

  1. はplpgsqlが(リストを選択して、動的にリストを選択して、動的にサーバー側の非SQL言語のクエリを生成し、クライアント側の言語での問合せまたは
  2. を生成しますまたはplperlは私の選択である)。今

秒だけの問題にシフトしますので、おそらくrefcursorを返し、プランナーはそれを返す前に、関数の出力を知っている必要があるので、そこからフェッチしなければならないので、最初はきれいです。

関連する問題