none
SQLでIF文のような条件をつけたい RRS feed

  • 質問

  • ■現状
    現在日単位でデータを加工するSQLを作成しています。
    WHERE句で「現在の年月」 = 「[日付]の年月」が同じであるかどうかで検索し、
    年月が一致しているものを対象に別テーブルから加工してINSERT INTOしています。
    当月のデータは、当月1日から現在日までまとめて更新している状況です。

    ■問題点
    クエリは毎日早朝に実行する必要があるのですが、以下のような問題が起きます。

    【9/10に実行した場合】
    対象の検索条件は、201909 = 201909なので9/10 の早朝までのデータが加工されますが、
    9/10 早朝以降のデータは9/11 のクエリ実行でまた加工されるため問題がありません。

    【9/30に実行した場合】
    対象の検索条件は、201909 = 201909のため9/30の早朝までのデータは加工して取り込まれますが、
    翌日は10/1のため、201910 = 201910のデータが集計されることになり、9/30の早朝から23:59までのデータが取り込まれないことになります。
    ※データは1時間おきにデータベースに追加されます。

    ■実現したいこと
    上記を踏まえて、以下を実現させたいです。
    ① 現在の日付が20191001=前月最終日(20190930)のデータ+20191001のデータの双方を加工して取り込む
    ② 現在の日付が20191001以外=今まで通りに年月で判断し、データを加工して取り込む

    ■クエリサンプル
    「現在の年月」 = 「[日付]の年月」を判断するクエリ
    ="WHERE FORMAT(GETDATE(),'yyyyMM') = FORMAT(CONVERT(DATETIME,[日付]),'yyyyMM')"



    SQLでこのようなことは実現可能なのでしょうか?
    もし可能であれば、何かアドバイスをいただけますと幸いです。
    よろしくお願いいたします。










    • 編集済み Lopez0312 2019年11月19日 9:11
    2019年11月19日 8:58

すべての返信

  • CASE 式を使えば、IF 判定のような条件分岐は可能ですね。

    要件によっては [日付]列を DATETIME に CONVERT してから抽出するよりも、
    「WHERE [日付] >= @p1 AND [日付] < @p2」の形式で範囲抽出するようにした方が効率が良いかもしれません。

    2019年11月19日 9:20
  • ストアドプロシージャを作成した方が簡単で見通しが良くなりそうですね。ストアドプロシージャなら普通にIF文が使えます。

    ちなみにですが、同じ月に何度か加工用のSQLを実行した場合、1日からのデータは何度も加工されて取り込まれることになるのでしょうか? であれば、もし比較できるなら、加工済みのデータに無ければ加工して取り込むというようにするのが良いように思います。比較する範囲は前月の1日以降で良いと思います。こうすれば現在が月初(1日)であるかどうかという判断は必要なくなります。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2019年11月20日 1:11