[pgsql-jp: 29412] SQLでできますか?

Shigeru Matsumoto matsu @ awh.co.jp
2003年 3月 14日 (金) 11:10:55 JST


こんにちは、松本と申します。



RedHat7.2, PostgreSQL7.2.1です。



<やりたい事>

t1               t2

aaa ( int4 )       aaa ( int4 )

bbb ( int2 )       bbb ( int2 )

ccc ( date )       xxx ( date )



t1.aaa, t1.bbbはそれぞれt2,aaa, t2.bbbの外部キーになっています。

ccc はyyyy/mm/ddのデータで xxx はyyyy/mm/01です。



(t2)     aaa       bbb         xxx

          1         1       2003/02/01

          1         1       2003/03/01

          1         1       2003/04/01

          1         2       2004/02/01

          1         2       2004/03/01

          1         2       2004/04/01

の時

t1.aaa(1), t1.bbb(1)のt1.cccが2002/03/11

t1.aaa(1), t1.bbb(2)のt1.cccが2004/01/25

として

(フィールド) t2.aaa, t2.bbb, 1, 2, 3, 4, 5

1, 1, 123456789ABC, 1〇〇〇56789ABC, 123456789ABC, 123456789ABC,
123456789ABC

1, 2, 1〇〇〇56789ABC, 123456789ABC, 123456789ABC, 123456789ABC,
123456789ABC

の

2レコードを抽出したいのです。



フィールド1, 2, 3, 4, 5はt1.cccの年からスタートした5年間です。

123456789ABCは月です。



(自分で考えたこと)

<view1> 1年目のview

select t2.aaa, t2.bbb, min(case when date_part(‘YEAR’, t1.ccc) || ‘/01’

 = date_part(‘YEAR’, t2.xxx) || ‘/’ || date_part(‘MONTH’, t2.xxx) then
‘〇’ else ‘1’ end), ……….

12ケ月分フィールドを追加

t2.aaa, t2.bbbでgroup by

* minを使えば、数字、アルファベットよりも記号が優先されるため。



<view2> 2年目のview

select t2.aaa, t2.bbb, min(case when date_part(‘YEAR’, t1.ccc  +  ‘1 year
’::interval) || ‘/01’

 = date_part(‘YEAR’, t2.xxx) || date_part(‘MONTH’, t2.xxx) then ‘〇’
else ‘1’ end), ……….



select t1.aaa, t1.bbb, view1の12フィールド, view2の12フィールド, ………

from t1, view1, view2, ……..

where (view1.aaa = t1.aaa and view1.bbb = t1.bbb) and (view2.aaa = t1.aaa
and view2.bbb = t1.bbb)

で

というものですが



ご意見、または他に方法があれば

教えて頂けないでしょうか。



よろしくお願いします。






pgsql-jp メーリングリストの案内