आम तौर पर, मैं एक स्थिर कैलेंडर तालिका रखने का सुझाव दूंगा जिसमें तिथियों की अनुक्रमिक सूची हो। हालांकि, कैड रॉक्स के कैलेंडर तालिका बनाने के चतुर दृष्टिकोण का उपयोग करके, आपके पास कुछ ऐसा होगा:
;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);
अब, यदि यह मामला है कि आप देश पर फ़िल्टर करना चाहते हैं, तो दिए गए देश के लिए केवल वही दिन लौटाए जाते हैं जिनके पास डेटा है, तो आपको बस लेफ्ट जॉइन को इनर जॉइन में बदलना होगा।
जोड़
टिप्पणियों से, सभी देशों को यह दिखाने का अनुरोध किया गया था कि उनके पास अनुरोध है या नहीं। ऐसा करने के लिए, आपको देशों की तालिका में शामिल होने की आवश्यकता है:
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);