2013年4月21日 星期日

使用CrossTab製作樞紐分析表(二)


上回我們留下三個問題:
  1. 如果有些日期的某些科目沒有值,這時顯示會有錯誤,系統會將數值誤值至其他科目。
  2. 通常日期會有不定個數,上述方法只顯示兩期(f_20050601, f_20050701),但資料其實不只兩期,我們需先執行 select distinct datekey' from account_data 才能知道有多少期。
  3. 每個個案的日期個數不同,甚至資料表不同,我們每次都要改寫crosstab嗎? 能不能寫成一個通用的function呢?
本回我們要解決第一個問題,
crosstab另外提供一個參數 VALUES,設定欄位的名稱,設定後數值即會依照欄位名稱正確擺放,SQL修正如下:
SELECT output_table1.*  FROM crosstab(
    'SELECT
        i1.account_code::text As col_name,
        i2.datekey::integer As row_name,
        i2.account_amount::double precision As cell_value
    FROM tejdb.account_profile i1
    JOIN tejdb.account_data As i2
    ON (i1.account_code = i2.account_code)
    where  i1.account_code <=6060 and  i1.account_code >=6000
    order by i1.account_code, i2.datekey'
, $$ values ('20050701'::text), ('20050801')$$
)
As output_table1(account_code text, f_20050701 double precision, f_20050801 double precision);

沒有留言:

張貼留言