Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-ABFRAGE, die Zwischendaten als spezifische Daten + Daten anzeigt, die zu jedem Datum gehören!

Normalerweise würde ich vorschlagen, eine statische Kalendertabelle zu haben, die eine fortlaufende Liste von Daten enthält. Wenn Sie jedoch den cleveren Ansatz von Cade Roux verwenden, eine Kalendertabelle zu erstellen, erhalten Sie so etwas wie:

;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); 

Wenn Sie nun nach Ländern filtern möchten, sodass nur die Tage zurückgegeben werden, die für das angegebene Land Daten enthalten, müssen Sie einfach den Left Join in einen Inner Join ändern.

ZUSATZ

Aus den Kommentaren wurde gefordert, allen Ländern zu zeigen, ob sie eine Anfrage haben oder nicht. Dazu müssen Sie sich mit der Ländertabelle verbinden:

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);