Normalmente, sugiro ter uma tabela de calendário estática que contenha uma lista sequencial de datas. No entanto, usando a abordagem inteligente de Cade Roux de gerar uma tabela de calendário, você teria algo como:
;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);
Agora, se for o caso de você desejar filtrar por país de modo que os únicos dias retornados sejam aqueles para o determinado país que possui dados, basta alterar a Junção Esquerda para uma Junção Interna.
ADIÇÃO
A partir dos comentários, foi solicitado mostrar a todos os países se eles têm um Pedido ou não. Para fazer isso, você precisa fazer cross join na tabela de países:
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);