Обикновено бих предложил да имате статична календарна таблица, която съдържа последователен списък с дати. Въпреки това, използвайки умния подход на Cade Roux за генериране на календарна таблица, ще имате нещо като:
;With Calendar As
(
Select Cast(Floor(Cast(@StartDate As float)) As datetime) As [Date]
Union All
Select DateAdd(d, 1, [Date])
From Calendar
Where DateAdd(d, 1, [Date]) < @EndDate
)
Select C.[Date], R.Country, Sum(R.PeopleNeeded)
From Calendar As C
Left Join Requests As R
On C.[Date] Between R.[Start Date] And R.[End Date]
And ( @Country Is Null Or R.Country = @Country )
Group By C.[Date], R.Country
Option (MAXRECURSION 0);
Сега, ако случаят е такъв, че искате да филтрирате по държава, така че единствените върнати дни да са тези за дадената държава, които имат данни, тогава просто ще трябва да промените лявото присъединяване към вътрешно присъединяване.
ДОПЪЛНЕНИЕ
От коментарите беше поискано да се покаже на всички държави дали имат искане или не. За да направите това, трябва да се присъедините към таблицата Държави:
With Calendar As
(
Select Cast(Floor(Cast(@StartDate As float)) As datetime) As [Date]
Union All
Select DateAdd(d, 1, [Date])
From Calendar
Where DateAdd(d, 1, [Date]) < @EndDate
)
Select C.[Date], C2.Country, Sum(R.PeopleNeeded)
From Calendar As C
Cross Join Countries As C2
Left Join Requests As R
On C.[Date] Between R.[Start Date] And R.[End Date]
And R.CountryId = C2.CountryId
Group By C.[Date], C2.Country
Option (MAXRECURSION 0);