Normalmente, suggerirei di avere una tabella di calendario statica che contiene un elenco sequenziale di date. Tuttavia, utilizzando l'approccio intelligente di Cade Roux di generare una tabella del calendario, avresti qualcosa del tipo:
;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);
Ora, se si desidera filtrare in base al paese in modo tale che gli unici giorni restituiti siano quelli per il paese in cui sono presenti dati, è sufficiente modificare il Left Join in un Inner Join.
AGGIUNTA
Dai commenti, è stato chiesto di mostrare a tutti i paesi se hanno una richiesta o meno. Per fare ciò, devi eseguire il cross join alla tabella Paesi:
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);