Я поместил некоторые случайные данные во временную таблицу, чтобы написать это:
select CAST(v.startDate as datetime) startDate, CAST(v.duration as int) duration
into ##leave
from (values('2018-05-15','9'),('2018-03-21','10'),('2018-01-12','5'),('2017-12-24','1'),('2017-11-25','10'),('2017-11-09','2'),('2017-09-28','2'),('2017-07-29','2'),('2017-05-18','1'),('2017-02-24','9'),('2016-11-28','4'),('2016-08-27','4'))v(startDate,duration)
;
declare @maxLeaveLen integer = (select MAX(duration) from ##leave)
;
with ml as (
select 1 n
union all
select n + 1 from ml
where n + 1 <= @maxLeaveLen
), sd as (
select DATENAME(weekday, DATEADD(day, ml.n - 1, l.startDate)) [weekday]
from ml ml
cross join ##leave l
where ml.n <= l.duration
) select sd.weekday, COUNT(1)
from sd
group by sd.weekday