Normálně bych navrhoval mít statickou kalendářovou tabulku, která obsahuje sekvenční seznam dat. Nicméně pomocí chytrého přístupu Cade Rouxe k generování kalendářové tabulky byste měli něco jako:
;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);
Nyní, pokud chcete filtrovat podle země tak, že se vrátí pouze dny pro danou zemi, která má data, pak byste jednoduše museli změnit Left Join na Inner Join.
DOPLNĚNÍ
Z komentářů bylo požadováno, aby všechny země ukázaly, zda mají požadavek, či nikoli. Chcete-li to provést, musíte se připojit k tabulce Země:
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);