こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

日付範囲を展開したレコードを作成したい

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で利用するつもりです。

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

投稿日時 - 2012-08-16 11:46:58

QNo.7646612

すぐに回答ほしいです

質問者が選んだベストアンサー

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)));

投稿日時 - 2012-08-16 14:59:01

お礼

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

投稿日時 - 2012-08-17 08:52:16

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2012-08-16 14:55:27

お礼

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

投稿日時 - 2012-08-17 08:51:16

あなたにオススメの質問