Oracleのバージョンが書いていないのですが、10g以降であればmodel句を使って、こんな感じでどうでしょうか。
SDATE、EDATEのデータ型が不明なのでDate型と言う前提です。
--この部分はテーブルを作るのが面倒なので疑似データを用意しているだけです
with tableA as (
select 1 KEY1, 1 KEY2, 1 KEY3, date '2012-07-12' SDATE, date '2012-09-11' EDATE from DUAL
union all select 2 KEY1, 2 KEY2, 2 KEY3, date '2012-06-01' SDATE, date '2012-07-31' EDATE from DUAL
)
--実際のSQLはここから
select key1,key2,key3,to_char(dt, 'yyyy/mm/dd') dt
from tableA
model
partition by (KEY1,KEY2,KEY3)
dimension by (0 as IND)
measures(trunc(SDATE, 'mm') as DT, months_between(trunc(EDATE,'mm'), trunc(SDATE,'mm')) as TERM)
rules(DT[for IND from 0 to TERM[0] increment 1] = add_months(DT[0], cv(IND)));
お礼
ありがとうございます。 試して見たところ、思うようなことができそうでした。 ちょっと意味がわからないので、調べながら応用きかせつつ実装してみようかと思います。