Normalerweise würde ich vorschlagen, eine statische Kalendertabelle zu haben, die eine fortlaufende Liste von Daten enthält. Wenn Sie jedoch den cleveren Ansatz von Cade Roux verwenden, eine Kalendertabelle zu erstellen, erhalten Sie so etwas wie:
;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);
Wenn Sie nun nach Ländern filtern möchten, sodass nur die Tage zurückgegeben werden, die für das angegebene Land Daten enthalten, müssen Sie einfach den Left Join in einen Inner Join ändern.
ZUSATZ
Aus den Kommentaren wurde gefordert, allen Ländern zu zeigen, ob sie eine Anfrage haben oder nicht. Dazu müssen Sie sich mit der Ländertabelle verbinden:
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);