Biasanya, saya sarankan memiliki tabel kalender statis yang berisi daftar tanggal berurutan. Namun, menggunakan pendekatan cerdas Cade Roux untuk membuat tabel kalender, Anda akan memiliki sesuatu seperti:
;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);
Sekarang, jika Anda ingin memfilter negara sehingga satu-satunya hari yang dikembalikan adalah hari-hari untuk negara tertentu yang memiliki data, maka Anda hanya perlu mengubah Gabung Kiri menjadi Gabung Dalam.
TAMBAHAN
Dari komentar, diminta untuk menunjukkan semua negara apakah mereka memiliki Permintaan atau tidak. Untuk melakukannya, Anda perlu melakukan cross join ke tabel Negara:
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);