0

月ごとにグループ化して、12か月のすべての経費を経費テーブルから取得しようとしています。1か月に結果がない場合でも、今月は0(ゼロ)の値の結果を受け取りたいと思います。

私のデータベースはPostgreSQL9.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

障害は、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;
于 2012-06-28T19:05:53.003 に答える