簡體   English   中英

使用generate_series的動態交叉表

[英]Dynamic crosstab using 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,

這里的問題是計划者在計划之前需要知道行的大​​小。 因此,您有幾種選擇:

  1. 選擇列表並以客戶端語言動態生成查詢,或者
  2. 選擇列表並以服務器端非SQL語言動態生成查詢(我會選擇plpgsql或plperl)。

現在,第一種方法比較干凈,因為第二種方法可以解決問題,因此您可能必須返回一個refcursor並從中獲取,因為計划人員需要在返回函數之前先知道函數的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM