1

私は以下のようなテーブルを持っています

ID StartDate    EndDate
1  15-MAR-2009  8-DEC-2011
2  14-JAN-2010  18-FEB-2013

このような出力が必要です-

ID  StartDate    EndDate
1   15-MAR-2009  31-DEC-2009
1   1-JAN-2010   31-DEC-2010
1   1-JAN-2011   8-Dec-2011
2   14-JAN-2010  31-DEC-2010
2   1-JAN-2011   31-DEC-2011
2   1-JAN-2012   31-DEC-2012
2   1-JAN-2013   18-FEB-2013

データベースとして 9i oracle を使用しています。informatica でこれを行うことをお勧めしますが、そこで解決策を見つけるのは難しいようです。プロシージャを作成できないため、SQL クエリが必要です。誰かがインフォマティカ 8.6 で提供できれば、それはさらに素晴らしいことです。

編集:-

Create table test_range
(Sr_No number,
start_date date,
end_date date)

create table yr_range
(years date);

挿入ステートメント:-

insert into test_range values (1,'15-MAR-2009','8-DEC-2011');
insert into test_range values (2,'14-JAN-2010','18-FEB-2013');

insert into yr_range values ('31-Dec-2005');
insert into yr_range values ('31-Dec-2006');
insert into yr_range values ('31-Dec-2007');
insert into yr_range values ('31-Dec-2008');
insert into yr_range values ('31-Dec-2009');
insert into yr_range values ('31-Dec-2010');
insert into yr_range values ('31-Dec-2011');
insert into yr_range values ('31-Dec-2012');
insert into yr_range values ('31-Dec-2013');

回答の1つで提案されているように、必要な出力を取得するために別のテーブルを作成しました.1つのテーブルのみ(つまり、test_range)を使用することは可能ですか? 1 つを確定する前に、すべてのオプションを探索する必要があります。

4

1 に答える 1

2

各行が年を表す年ディメンションのようなものがある場合、その年が範囲内にあるかどうかに基づいて結合します。これにより、必要な行数が得られ、行ごとに条件付きで開始/終了範囲が出力されます。これは、範囲が 1 年未満で分割されない場合にも対処する必要があります。

y.Year は整数と見なされます。

ここで実際の例を参照してください: http://sqlfiddle.com/#!4/d4589/13/11

Create table test_range
(Sr_No number,
StartDate date,
EndDate date);

create table yr_range
(years number);

insert into test_range values (1,'15-MAR-2009','8-DEC-2011');
insert into test_range values (2,'14-JAN-2010','18-FEB-2013');

insert into yr_range values ('2005');
insert into yr_range values ('2006');
insert into yr_range values ('2007');
insert into yr_range values ('2008');
insert into yr_range values ('2009');
insert into yr_range values ('2010');
insert into yr_range values ('2011');
insert into yr_range values ('2012');
insert into yr_range values ('2013');


select
r.Sr_No,
CASE
  When to_char( r.StartDate, 'yyyy') = y.years Then r.StartDate
  Else to_date( y.years || '/01/01', 'yyyy/mm/dd')  
END as StartDate,
CASE
  When to_char( r.EndDate , 'yyyy') = y.years Then r.EndDate
  Else to_date( y.years || '/12/31', 'yyyy/mm/dd')  
END as EndDate 
from test_range r, yr_range y 
where
      to_char( r.StartDate, 'yyyy') <= y.years  
  AND to_char( r.EndDate, 'yyyy')  >= y.years;

次の手法のいくつかを使用して年数列を生成することもできます: ORACLE SQL: 2 つの数値の間のすべての整数を取得する

于 2012-11-12T04:41:36.613 に答える