Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

QUERY SQL che mostra tra le date come date specifiche + Dati appartenenti a ciascuna data!

Normalmente, suggerirei di avere una tabella di calendario statica che contiene un elenco sequenziale di date. Tuttavia, utilizzando l'approccio intelligente di Cade Roux di generare una tabella del calendario, avresti qualcosa del tipo:

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

Ora, se si desidera filtrare in base al paese in modo tale che gli unici giorni restituiti siano quelli per il paese in cui sono presenti dati, è sufficiente modificare il Left Join in un Inner Join.

AGGIUNTA

Dai commenti, è stato chiesto di mostrare a tutti i paesi se hanno una richiesta o meno. Per fare ciò, devi eseguire il cross join alla tabella Paesi:

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