12

別のテーブルと結合することを期待して日付のリストを生成したいのですが、使用する構文がわかりません。これは次のようなものです。

SELECT dates.date, transactions.account_id, transactions.amount
  FROM (...) as dates
       LEFT JOIN transactions ON transactions.date = dates.date
 WHERE dates.date >= '2010-01-01' AND dates.date <= '2010-12-31'
 ORDER BY dates.date;

日付が欲しいので、クライアント側でデータをさらにマッサージする必要はありません。これを使用して、次のようなテーブルを表示しています。

Account    2010-01-01    2010-01-02    2010-01-03    Balance
============================================================
Chase 123        +100           -20           -70        +10
Chase 231                       +13            -9         +4
4

1 に答える 1

12

日付のリスト

generate_series関数を使用して、日付のリストを取得するために日付に追加できる数値のリストを取得します。

SELECT CURRENT_DATE + s.a AS dates 
  FROM generate_series(0,14,7) as s(a);

結果:

dates
------------
2004-02-05
2004-02-12
2004-02-19

ピボット

質問の後半では、結果セットのピボット、つまり行データを列データに変換する方法について説明します。PIVOTとUNPIVOTはANSIですが、現在PostgreSQLでサポートされているとは思いません。クエリをピボットする最も一貫してサポートされている手段は、集計関数を使用することです。

   SELECT t.account,
          SUM(CASE WHEN t.date = '2010-01-01' THEN t.amount END) AS '2010-01-01',
          SUM(CASE WHEN t.date = '2010-01-02' THEN t.amount END) AS '2010-01-02',
          SUM(CASE WHEN t.date = '2010-01-03' THEN t.amount END) AS '2010-01-03',
          SUM(t.amount) AS Balance
     FROM (SELECT CURRENT_DATE + s.a AS dates 
             FROM generate_series(0,14,7) as s(a)) x
LEFT JOIN TRANSACTIONS y ON y.date = x.date
 GROUP BY t.account

動的列

...動的SQLを意味します。

于 2010-10-23T01:52:09.267 に答える