- ベストアンサー
【要約】UPDATE文の作成方法を教えてください
- UPDATE文を使用して、店マスタの実績欄と予定欄を更新する方法を教えてください。
- トランの区分が1の場合は、実績欄にトランの日付情報をセットし、実績2を実績3に、実績1を実績2に移動させます。
- トランの区分が2の場合は、予定欄にトランの日付情報をセットし、直近3日分の予定を設定します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。先ほどのSQLについて少し説明しますね。 1.一番内側のselect文(トランを直接参照していることろ)で、 「直近3日分を予定欄へセットする」を満たすために、店CD・区分ごとに日付順でならべた行番号を振ります。 このとき、実績データ(区分='1')には1件しかない前提なので必ず1が振られます。 2.その一つ外のselect文では、1.で振った行番号が3以下という条件で抽出します。 これにより、実績データと予定データの直近3件が取れます。 ここで、区分と1.で振った行番号を使って実績と予定1~3を取得します。 3.そして一番外側のselect文で、マスタと結合して各項目に設定する値を取得しています。 「実績2を実績3へ、実績1を実績2へ移してから、トランの日付を実績1欄にセットする」とあるので、 実績1は、2.で実績が取得できていればその値を設定し、取得できていなければ現在の値を再設定(=更新しない)。 実績2・3は、2.で実績が取得できていればそれぞれ実績1・2を設定し、取得できていなければ現在の値を再設定(=更新しない)。 予定に関しては、2.で取得した予定1~3をそのまま設定。 という感じです。 内側からひとつずつselect文を実行していくと、やっていることが分かると思います。 もちろん、もっといいやり方もあると思いますが参考にしてみてください。
その他の回答 (1)
- yamada_g
- ベストアンサー率68% (258/374)
ちょっと長くなってしまいましたが、これでどうでしょうか? oracle10g XE では希望結果になりました。 ただ、ご提示のデータだと店CD:0003の予定1はnullのままのはずなので、そこが相違しますが。 --全角でインデントしてます update マスタ set (実績1,実績2,実績3,予定1,予定2,予定3) = ( select nvl(TRN.実績,マスタ.実績1) ,case when TRN.実績 is not null then マスタ.実績1 else マスタ.実績2 end ,case when TRN.実績 is not null then マスタ.実績2 else マスタ.実績3 end ,TRN.予定1,TRN.予定2,TRN.予定3 from ( select 店CD ,max(case when 区分 = '1' then 日付 else null end) 実績 ,max(case when 区分 = '2' and recnum = 1 then 日付 else null end) 予定1 ,max(case when 区分 = '2' and recnum = 2 then 日付 else null end) 予定2 ,max(case when 区分 = '2' and recnum = 3 then 日付 else null end) 予定3 from ( select 店CD,日付,区分,row_number() over(partition by 店CD, 区分 order by 日付) recnum from トラン) where recnum <= 3 group by 店CD) TRN where マスタ.店CD = TRN.店CD) where exists (select * from トラン where マスタ.店CD = トラン.店CD); 記載された更新SQLでは値の数が合っていませんし、トランには実績Nという項目は存在しないので エラーで実行することすら出来ないと思うのですが・・?
お礼
yamada_g 様 いつもありがとうございます。 頂いたUPDATE文をお借りして、テストしてみます。 私の頭では、まだ理解出来ていないので、またお力をお借りするかも しれませんが、その時はよろしくお願いします。 ※私の載せたUPDATE文、おかしかったです。 項目をあわせて、INNERJOINしたら、一応!?動いてたので・・ 見直しが足りませんでした。
お礼
yamada_g 様 親切丁寧なご説明、ありがとうございます。 先ほどのSQL、完璧に動作しました。 本当にUPDATE文一つで動くとは思っていなかったので、 驚いています。 現在PGに入り、今後も分からないことだらけで質問を あげることになると思います。 また、よろしくお願いします。 本当にありがとうございました。