sql >> データベース >  >> RDS >> Sqlserver

日付間を特定の日付として表示する SQL クエリ + 各日付に属するデータ!

    通常、日付の連続したリストを含む静的なカレンダー テーブルを用意することをお勧めします。ただし、カレンダー テーブルを生成する 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); 
    

    ここで、返される日がデータのある特定の国の日のみになるように国でフィルター処理する場合は、左結合を内部結合に変更するだけです。

    追加

    コメントから、リクエストがあるかどうかにかかわらず、すべての国を表示するようにリクエストされました。これを行うには、Countries テーブルにクロス結合する必要があります:

    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. mysqlまたはpostgresで、IN(1,2、n)ステートメントのサイズに制限はありますか?

    2. 範囲基準を使用した結合テーブルでのMySQLの最適化

    3. MySQLDELIMITERキーワードが機能していません

    4. SQL構文のみ(PHPなし)を使用してmysqlテーブルのblobに画像を挿入するにはどうすればよいですか?