Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL QUERY mostrando Entre Datas como datas específicas + Dados pertencentes a cada data!


Normalmente, sugiro ter uma tabela de calendário estática que contenha uma lista sequencial de datas. No entanto, usando a abordagem inteligente de Cade Roux de gerar uma tabela de calendário, você teria algo como:
;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); 

Agora, se for o caso de você desejar filtrar por país de modo que os únicos dias retornados sejam aqueles para o determinado país que possui dados, basta alterar a Junção Esquerda para uma Junção Interna.

ADIÇÃO

A partir dos comentários, foi solicitado mostrar a todos os países se eles têm um Pedido ou não. Para fazer isso, você precisa fazer cross join na tabela de países:
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);