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

7-47 平日で3日後を取得

SQLパズル

年月日テーブル
年月日    休日Flg
--------  -------
20051217        0
20051218        0  ←指定日
20051219        1
20051220        0
20051221        0
20051222        0  ←出力する日
20051223        1
20051224        0

年月日テーブルから、
2005年12月18日から、平日で3日後の年月日(20051222)を出力する。


データ作成スクリプト

create table 年月日テーブル(
年月日  number(8),
休日Flg number(1));

insert into 年月日テーブル values(20051217,0);
insert into 年月日テーブル values(20051218,0);
insert into 年月日テーブル values(20051219,1);
insert into 年月日テーブル values(20051220,0);
insert into 年月日テーブル values(20051221,0);
insert into 年月日テーブル values(20051222,0);
insert into 年月日テーブル values(20051223,1);
insert into 年月日テーブル values(20051224,0);
commit;


SQL

--■■■count関数を使う方法■■■
select min(年月日) as 年月日
from (select 年月日,count(decode(休日Flg,0,1)) over(order by 年月日) as cnt
        from 年月日テーブル
       where 20051218 < 年月日)
 where cnt = 3;

--■■■count関数とnullif関数を使う方法■■■
select 年月日 as "平日で3日後"
from 年月日テーブル a
where (select count(nullif(b.休日Flg,1))
         from 年月日テーブル b
        where 20051218 < b.年月日
          and b.年月日 <= a.年月日) = 3
  and 休日Flg = 0;

--■■■sum関数とdecode関数を使う方法■■■
select 年月日 as "平日で3日後"
from 年月日テーブル a
where (select sum(decode(b.休日Flg,1,0,1))
         from 年月日テーブル b
        where 20051218 < b.年月日
          and b.年月日 <= a.年月日) = 3
  and 休日Flg = 0;


解説

count関数とnullif関数を、組み合わる方法や、
sum関数とdecode関数を組み合わせる方法があります。