sql >> Databasteknik >  >> RDS >> Sqlserver

SQL QUERY som visar Between Dates som specifika datum + Data som hör till varje datum!

Normalt skulle jag föreslå att ha en statisk kalendertabell som innehåller en sekventiell lista över datum. Men med Cade Roux smarta tillvägagångssätt att skapa en kalendertabell, skulle du ha något i stil med:

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

Nu, om det är så att du vill filtrera på land så att de enda dagar som returneras är de för det givna landet som har data, då skulle du helt enkelt behöva ändra den vänstra kopplingen till en inre koppling.

TILLÄGG

Från kommentarerna ombads det att visa alla länder om de har en begäran eller inte. För att göra det måste du korsansluta till tabellen Länder:

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


  1. Skillnaden mellan `brew services start mysql` och `mysql.server start`

  2. Välj TOP X (eller botten) procent för numeriska värden i MySQL

  3. Släpp alla funktioner från Postgres databas

  4. mysql lagrad procedurfel (1172, 'Resultat bestod av mer än en rad')