Normaal gesproken zou ik voorstellen om een statische kalendertabel te hebben die een opeenvolgende lijst met datums bevat. Als je echter de slimme benadering van Cade Roux gebruikt om een kalendertabel te genereren, zou je zoiets krijgen als:
;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);
Als het nu zo is dat u op land wilt filteren zodat de enige dagen die worden geretourneerd die zijn voor het gegeven land dat gegevens heeft, dan hoeft u alleen de Left Join te wijzigen in een Inner Join.
AANVULLING
Uit de reacties werd gevraagd om alle landen te laten zien of ze een Verzoek hebben of niet. Om dat te doen, moet je cross join naar de tabel Landen:
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);