-PR-
  • すぐに回答を!
  • 質問No.7646612
解決
済み

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

  • 閲覧数528
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 66% (482/721)

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

ストアド内だけで実装可能でしょうか?
  • 回答数2
  • 気になる数0

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

  • 回答No.2
レベル12

ベストアンサー率 68% (258/374)

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)));
お礼コメント
naktak

お礼率 66% (482/721)

ありがとうございます。
試して見たところ、思うようなことができそうでした。
ちょっと意味がわからないので、調べながら応用きかせつつ実装してみようかと思います。
投稿日時 - 2012-08-17 08:52:16
  • ありがとう数0
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル9

ベストアンサー率 67% (49/73)

Oracle 11g R1以降であれば、Pivot(UnPivot)を駆使すれば実現できると思います。 ...続きを読む
Oracle 11g R1以降であれば、Pivot(UnPivot)を駆使すれば実現できると思います。
お礼コメント
naktak

お礼率 66% (482/721)

ありがとうございます。
Pivotを調べてみましたが、どうも駆使の仕方が難しそうなので諦めました・・・。
投稿日時 - 2012-08-17 08:51:16
  • ありがとう数0
  • 回答数2
  • 気になる数0
このQ&Aのテーマ
このQ&Aで解決しましたか?

関連するQ&A

-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ