2016-05-29 63 views
0

嘗試使用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

回答

0

這裏的問題是,策劃者需要知道之前規劃的行大小。所以,你有幾種選擇:

  1. 選擇列表和動態生成客戶端語言或查詢
  2. 選擇列表和動態生成的服務器端非SQL語言查詢(PLPGSQL或plperl將是我的選擇)。

現在,首先是因爲清潔第二隻是轉移問題,所以你可能要返回一個refcursor和因爲規劃需要返回之前知道函數的輸出從獲取。