あまり深く考えていませんので、件数が多いと使いものにならないかもしれません。
with 休日テーブル as (
select 'busyo1' 部署コード, date'2014-09-13' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-14' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-20' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-21' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-23' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-07' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-14' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-21' 休日 from dual
union all select 'busyo3' 部署コード, date'2014-09-20' 休日 from dual
)
, 日付 as (
select trunc(/* sysdate */ date'2014-09-24' - 1) - level 日付
from dual
--とりあえず過去30日分の日付
connect by level <= 30)
select 部署コード, 日付
from (
select 部署コード, 日付, count(*) over(partition by 部署コード order by 日付 desc) cnt
from (select distinct 部署コード from 休日テーブル) 部署マスタ
cross join 日付
where not exists (
select * from 休日テーブル where 部署マスタ.部署コード = 休日テーブル.部署コード and 日付.日付 = 休日テーブル.休日
)
)
where cnt = 10;
こまかい説明を書く時間がないので、そこはSQLから読みとってください。すみません・・・
お礼
いえいえ、SQLから自分で読み解くのは当たり前だと思っています。 教えていただけただけでも大変ありがたく感じております。 さすがにはじめて見る記述だらけで解読に手間取りましたが おかげさまで無事に一日を終えることができました。 ありがとうございました。