Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL QUERY, показващ Между датите като конкретни дати + Данни, принадлежащи към всяка дата!

Обикновено бих предложил да имате статична календарна таблица, която съдържа последователен списък с дати. Въпреки това, използвайки умния подход на Cade Roux за генериране на календарна таблица, ще имате нещо като:

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

Сега, ако случаят е такъв, че искате да филтрирате по държава, така че единствените върнати дни да са тези за дадената държава, които имат данни, тогава просто ще трябва да промените лявото присъединяване към вътрешно присъединяване.

ДОПЪЛНЕНИЕ

От коментарите беше поискано да се покаже на всички държави дали имат искане или не. За да направите това, трябва да се присъедините към таблицата Държави:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Имате нужда от помощ за намиране на правилната T-SQL заявка

  2. Добавете колона към таблицата и след това я актуализирайте в транзакцията

  3. Променлива IN израз в SQL

  4. Неправилен синтаксис близо до „LIMIT“ при използване на mssql

  5. Съхранена процедура и попълване на временна таблица от свързана съхранена процедура с параметри