トップページに戻る
次の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関数を組み合わせる方法があります。