Normalt skulle jag föreslå att ha en statisk kalendertabell som innehåller en sekventiell lista över datum. Men med Cade Roux smarta tillvägagångssätt att skapa en kalendertabell, skulle du ha något i stil med:
;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);
Nu, om det är så att du vill filtrera på land så att de enda dagar som returneras är de för det givna landet som har data, då skulle du helt enkelt behöva ändra den vänstra kopplingen till en inre koppling.
TILLÄGG
Från kommentarerna ombads det att visa alla länder om de har en begäran eller inte. För att göra det måste du korsansluta till tabellen Länder:
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);