障害は、JOIN条件で出力列の名前()を参照しようとしたことです。この場合、出力列act_month
は表示されません。まだ計算されていません。試す:
SELECT fta.liability_id
,fta.amount
,date_part('month', fta.act_date) AS act_month
FROM (
SELECT i
FROM generate_series(1,array_upper(ARRAY[1,2,3,4,5,6,7,8,9,10,11,12],1)) i
) ym
LEFT JOIN financial_t_account fta
ON ym.i = date_part('month', fta.act_date)::int;
主に次のように簡略化できます。
SELECT fta.liability_id
,fta.amount
,date_part('month', fta.act_date) AS act_month
FROM generate_series(1,12) ym(i)
LEFT JOIN financial_t_account fta
ON ym.i = date_part('month', fta.act_date)::int;
または、配列から任意の月が必要な場合は、次unnest()
の代わりに使用しgenerate_series()
ます。
...
FROM unnest(ARRAY[1,2,4,57,8,11,12]) ym(i)
...
CTE (またはサブクエリ)を使用して、式の繰り返し(および2回の評価)を回避します。
WITH x AS (
SELECT *, date_part('month', act_date)::int As act_month
FROM financial_t_account
)
SELECT x.liability_id
,x.amount
,x.act_month
FROM generate_series(1,12) ym(i)
LEFT JOIN x ON ym.i = x.act_month;