Normalement, je suggérerais d'avoir une table de calendrier statique contenant une liste séquentielle de dates. Cependant, en utilisant l'approche intelligente de Cade Roux consistant à générer un tableau de calendrier, vous auriez quelque chose comme :
;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);
Maintenant, si vous souhaitez filtrer par pays de sorte que les seuls jours renvoyés soient ceux du pays donné qui contiennent des données, il vous suffira alors de remplacer la jointure gauche par une jointure interne.
AJOUT
À partir des commentaires, il a été demandé de montrer à tous les pays s'ils ont une demande ou non. Pour ce faire, vous devez effectuer une jointure croisée avec la table Pays :
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);