Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL QUERY montrant Entre les dates comme dates spécifiques + Données appartenant à chaque date !

Normalement, je suggérerais d'avoir une table de calendrier statique contenant une liste séquentielle de dates. Cependant, en utilisant l'approche intelligente de Cade Roux consistant à générer un tableau de calendrier, vous auriez quelque chose comme :

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

Maintenant, si vous souhaitez filtrer par pays de sorte que les seuls jours renvoyés soient ceux du pays donné qui contiennent des données, il vous suffira alors de remplacer la jointure gauche par une jointure interne.

AJOUT

À partir des commentaires, il a été demandé de montrer à tous les pays s'ils ont une demande ou non. Pour ce faire, vous devez effectuer une jointure croisée avec la table Pays :

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