0

我正在尝试按月分组从我的费用表中提取所有 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;
4

1 回答 1

1

错误是您尝试act_month在 JOIN 条件中引用输出列的名称 ( ),但它不可见 - 它尚未计算!尝试:

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;
于 2012-06-28T19:05:53.003 回答