プロが教えるわが家の防犯対策術!

Oracleでストアドパッケージを作っています。

key1 key2 key3 sdate   edate
1   1   1   2012/07/12 2012/09/11
2   2   2   2012/06/01 2012/07/31

こんなデータがあった時、以下のように日付の範囲を展開した
レコード群を得たいのですが、やり方が思いつきません。

key1 key2 key3 date
1   1   1   2012/07/01
1   1   1   2012/08/01
1   1   1   2012/09/01
2   2   2   2012/06/01
2   2   2   2012/07/01

事情により、Typeは使えません。
展開後、別途SQLで利用するつもりです。

ストアド内だけで実装可能でしょうか?

A 回答 (2件)

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)));
    • good
    • 1
この回答へのお礼

ありがとうございます。
試して見たところ、思うようなことができそうでした。
ちょっと意味がわからないので、調べながら応用きかせつつ実装してみようかと思います。

お礼日時:2012/08/17 08:52

Oracle 11g R1以降であれば、Pivot(UnPivot)を駆使すれば実現できると思います。

    • good
    • 0
この回答へのお礼

ありがとうございます。
Pivotを調べてみましたが、どうも駆使の仕方が難しそうなので諦めました・・・。

お礼日時:2012/08/17 08:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す