【问题标题】:Preserve all elements of an array while (left) joining to a table在(左)加入表格时保留数组的所有元素
【发布时间】:2012-06-28 09:58:47
【问题描述】:

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

【问题讨论】:

    标签: sql arrays postgresql left-join postgresql-9.1


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2019-11-25
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多