我正试图从我的费用表中提取所有12个月的费用,逐个月。 如果一个月内没有结果,我仍然希望收到这个月值0(零)值的结果。
我的数据库是PostgreSQL 9.1。
我写了这个查询,但我没有成功执行它或理解如何纠正它。
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) as ym
LEFT OUTER JOIN financial_t_account fta on ym.i = fta.act_month;
答案 0 :(得分:1)
错误是您尝试在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(或子查询)来避免重复表达式(并对其进行两次评估):
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;