sql >> Database >  >> RDS >> Sqlserver

SQL QUERY met tussen datums als specifieke datums + gegevens die bij elke datum horen!

Normaal gesproken zou ik voorstellen om een ​​statische kalendertabel te hebben die een opeenvolgende lijst met datums bevat. Als je echter de slimme benadering van Cade Roux gebruikt om een ​​kalendertabel te genereren, zou je zoiets krijgen als:

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

Als het nu zo is dat u op land wilt filteren zodat de enige dagen die worden geretourneerd die zijn voor het gegeven land dat gegevens heeft, dan hoeft u alleen de Left Join te wijzigen in een Inner Join.

AANVULLING

Uit de reacties werd gevraagd om alle landen te laten zien of ze een Verzoek hebben of niet. Om dat te doen, moet je cross join naar de tabel Landen:

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. Vereenvoudig gebruikersaccountbeheer met MariaDB MaxScale 2.2 en MariaDB Server 10.3

  2. Mysql utf32_unicode_ci en html charset utf-8 gebruikt, maar teken � verschijnt

  3. MySQL-juweeltje voor Ruby On Rails

  4. Hoe kan ik een wachtwoord-hash in PHP decoderen?