トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-323 年ごとの四半期を求める

SQLパズル

二つの日付型から年を取り出し、
その2つの年の間の四半期を求める。

出力結果
Val
-------------
2007-Quarter1
2007-Quarter2
2007-Quarter3
2007-Quarter4
2008-Quarter1
2008-Quarter2
2008-Quarter3
2008-Quarter4

こちらを参考にさせていただきました(英語)


SQL

--■■■model句を使う方法(10g以降)■■■
select to_char(nen) || '-Quarter' || to_char(Q) as Val
  from dual
 model return updated rows
dimension by(0 as nen,0 as Q)
measures(0 as dummy)
rules(dummy[for nen from extract(year from date '2007-01-01')
                      to extract(year from date '2008-02-28')
            increment 1,for Q in(1,2,3,4)] = 0);

--■■■表関数を使う方法■■■
create or replace Package Pack10_322 Is
    type PrintTypeSet is table of varchar2(20);
end;
/

create or replace function FuncQ(fromD date,ToD date) return Pack10_322.PrintTypeSet PipeLined IS
    outR varchar2(20);
begin
    for nen in to_number(to_char(fromD,'yyyy'))
             ..to_number(to_char(ToD,'yyyy')) Loop
        for Q in 1..4 Loop
            outR := to_char(nen) || '-Quarter' || to_char(Q);
            pipe row(outR);
        end Loop;
    end Loop;
end;
/

sho err

select Column_Value as Val from table(FuncQ(date '2007-01-01',date '2008-02-28'));


解説

補完列が複数列の時は、model句のforコンストラクトの位置参照を使うとシンプルになりますねぇ