通常、日付の連続したリストを含む静的なカレンダー テーブルを用意することをお勧めします。ただし、カレンダー テーブルを生成する Cade Roux の巧妙なアプローチを使用すると、次のようになります。
;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);
ここで、返される日がデータのある特定の国の日のみになるように国でフィルター処理する場合は、左結合を内部結合に変更するだけです。
追加
コメントから、リクエストがあるかどうかにかかわらず、すべての国を表示するようにリクエストされました。これを行うには、Countries テーブルにクロス結合する必要があります:
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);