sql >> Databáze >  >> RDS >> Sqlserver

SQL QUERY zobrazující mezi daty jako konkrétní data + data patřící ke každému datu!

Normálně bych navrhoval mít statickou kalendářovou tabulku, která obsahuje sekvenční seznam dat. Nicméně pomocí chytrého přístupu Cade Rouxe k generování kalendářové tabulky byste měli něco jako:

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

Nyní, pokud chcete filtrovat podle země tak, že se vrátí pouze dny pro danou zemi, která má data, pak byste jednoduše museli změnit Left Join na Inner Join.

DOPLNĚNÍ

Z komentářů bylo požadováno, aby všechny země ukázaly, zda mají požadavek, či nikoli. Chcete-li to provést, musíte se připojit k tabulce Země:

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. Proč při spuštění INSERT nedostávám dostatečné hodnoty?

  2. Jak spustit server Postgres?

  3. Zablokování SQL s operacemi výběru/aktualizace na tabulce

  4. Zabraňuje Knex.js vkládání SQL?