[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 メーリングリストの案内