Многофункциональное решение CTE (спасибо, Мартин!)
with AllDates as (
select StartDate as [day] from Request
union
select Enddate as [day] from Request),
TotalUsage as (
select [day], sum(allocated) as TotalAllocated
from AllDates
join Request
on [day] between StartDate and EndDate
group by [day]),
MaxPerRequest as (
select CountryId, StartDate, EndDate, Allocated, MAX(TotalAllocated) as MaxAllocated
from Request
join TotalUsage
on [day] between StartDate and EndDate
group by CountryId, StartDate, EndDate, Allocated
)
select StartDate, EndDate, Allocated, MaxAllocated, Country.People - MaxAllocated as Diff
from MaxPerRequest
join Country on MaxPerRequest.CountryId = Country.CountryId
Старое решение для временных таблиц
Увы, я не думаю, что вы можете вкладывать CTE, поэтому вам нужно что-то вроде
with alldates as (
select StartDate as [day] from request
union
select EndDate as [day] from request)
select [Day], sum(allocated) as TotalAllocated
into #TotalUsage
from alldates
join request on [Day] between StartDate and EndDate
group by [Day];
для построения общей суммы, выделенной на день для всех интересных дат, во временную таблицу. (Я никогда не могу вспомнить, какой механизм временных таблиц является лучшим для SQL Server, извините - может быть, лучше использовать переменную таблицы, и может потребоваться добавить индексы + ключи в любом случае.) Затем вы можете выбрать max (TotalAllocated) из для данного диапазона дат.
with MaxPerRequest as (
select CountryID, StartDate, EndDate, Allocated, MAX(TotalAllocated) as MaxAllocated
from request
join #TotalUsage
on [DAY] between StartDate and EndDate
group by CountryID, StartDate, EndDate, Allocated
)
select StartDate, EndDate, Allocated, MaxAllocated, Country.People - MaxAllocated as Diff
from MaxPerRequest
join Country on MaxPerRequest.CountryID = Country.CountryID
drop table #TotalUsage
Извините, я не могу придумать более простого решения.