sql >> Database teknologi >  >> RDS >> Sqlserver

SQL QUERY, der viser Between Dates som specifikke datoer + Data tilhørende hver dato!

Normalt vil jeg foreslå at have en statisk kalendertabel, som indeholder en sekventiel liste over datoer. Men ved at bruge Cade Roux' smarte tilgang til at generere en kalendertabel, ville du have noget som:

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

Nu, hvis det er tilfældet, at du ønsker at filtrere på land, således at de eneste dage, der returneres, er dem for det givne land, der har data, så skal du blot ændre Venstre tilslutning til en indre tilslutning.

TILFØJELSE

Fra kommentarerne blev det bedt om at vise alle lande, om de har en anmodning eller ej. For at gøre det skal du krydse join til tabellen Lande:

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. opret array fra mysql forespørgsel php

  2. SQL-forespørgsel med specialtegn - hvordan håndteres?

  3. Kalder en gemt PROCEDURE i Toad

  4. SQL Server trigger indsæt værdier fra ny række i en anden tabel med mange-til-mange-relation