Thông thường, tôi khuyên bạn nên có một bảng lịch tĩnh chứa danh sách ngày tháng tuần tự. Tuy nhiên, bằng cách sử dụng phương pháp tạo bảng lịch thông minh của Cade Roux, bạn sẽ có những thứ như sau:
;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);
Bây giờ, nếu trường hợp bạn muốn lọc theo quốc gia sao cho những ngày duy nhất được trả về là những ngày được trả về cho quốc gia nhất định có dữ liệu, thì bạn chỉ cần thay đổi Kết nối bên trái thành Tham gia bên trong.
BỔ SUNG
Từ các nhận xét, nó được yêu cầu hiển thị cho tất cả các quốc gia cho dù họ có Yêu cầu hay không. Để làm điều đó, bạn cần tham gia chéo vào bảng Quốc gia:
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);