CONNECT BY
を使用して、単純な行生成手法を使用できます。 構文:
with sample_data as (select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/14','MM/DD) /RR') end_date from dual)select id, to_char(add_months(start_date,level - 1),'Month YYYY') date_columnfrom sample_dataconnect by level <=抽出(終了日からの月) - 抽出(開始日からの月) + 1;コード> プレ>
編集 DISTINCT
の追加 これが行全体で機能することを許可する必要があると思いますが、間違っていることが証明されることに興味があります.編集2 複数の年を処理するように変更された例 (本来はそうすべきでした)。 (例 http://sqlfiddle.com/#!4/9eecb/4097/ を参照) 0
.)
with sample_data as ( select 'XXA' id, to_date('1/23/14','MM/DD/RR') start_date, to_date('3/12/15','MM/DD) /RR') end_date from dual union all select 'XXB' id, to_date('4/12/14','MM/DD/RR') start_date, to_date('6/18/15','MM/DD/ RR') end_date from dual )select distinct id, to_char(add_months(start_date,level - 1),'Month YYYY') date_column, add_months(start_date,level -1) sortkeyfrom sample_dataconnect by level <=ceil(months_between(trunc(end_date) ,'MM'), trunc(start_date,'MM'))) + 1ID順、ソートキー;
プレ>
私のサンドボックス DB では、次の結果が得られます:
ID DATE_COLUMN SORT_COLXXA 2014 年 1 月 23-JAN-2014 00:00:00XXA 2014 年 2 月 23-FEB-2014 00:00:00XXA 2014 年 3 月 23-MAR-2014 00:00:00XXB 2014 年 4 月 12-APR -2014 00:00:00XXB 2014 年 5 月 12-MAY-2014 00:00:00XXB 2014 年 6 月 12-JUN-2014 00:00:00
プレ>