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

日付範囲内のテーブルからすべての日付を選択し、空の日付ごとに 1 行を含める

    欠落している行を処理する方法はいくつかありますが、いずれも別のデータ セットを取得して現在の結果と組み合わせる方法です。

    これは、CTE または他のプロセス (あなたの例など) によって作成された結果、または (私の好み) 永続的な テンプレート を使用して作成された結果から派生する可能性があります。

    あなたの場合のテンプレートは、@datesTBL のような日付のテーブルにすぎません。違いは、たとえば 100 年分の日付で事前に作成されていることです。

    あなたのクエリはあなたの例に似ているかもしれませんが、私は次のことを試してみます...

    SELECT 
        dt.tempDate ,
        InstructorID,           EventStart, 
        EventEnd,               cancelled, 
        cancelledInstructor, 
        EventType,              DevName, 
        Room,                   SimLocation, 
        ClassLocation,          Event, 
        Duration,               TrainingDesc, 
        Crew,                   Notes, 
        LastAmended,            InstLastAmended, 
        ChangeAcknowledged,     Type, 
        OtherType,              OtherTypeDesc, 
        CourseType 
    FROM 
      @datesTBL dt 
    LEFT OUTER JOIN
      OpsInstructorEventsView iv
        ON  iv.EventStart >= dt.tempDate
        AND iv.EventStart <  dt.tempDate + 1
        AND iv.InstructorID = @InstructorID 
    WHERE
          dt.tempDate >= @StartDate
      AND dt.tempDate <= @EndDate
    ORDER BY
      dt.tempDate,
      iv.EventStart
    

    これにより、カレンダー テンプレートが配置されます 左側にあり、カレンダーの日付フィールドが常に入力されていること、常に日付のみ (時間部分なし) の値であること、順序が正しいこと、GROUP BY が簡単であることなどを知っているため、多くのクエリが簡単になります。



    1. 既存のすべてのテーブルデータをUTF8照合に変換する方法はありますか?

    2. Oracleで連結しながら文字列を順序付ける

    3. PL / SQLで関数を作成する方法は?

    4. コマンドラインを介してMySqlに大きなSQLファイルをインポートする