ORACLE UPDATE文の書き方と処理結果について

このQ&Aのポイント
  • SQLのUPDATEについて教えてください。売上実績の売上日情報を更新する方法を示します。
  • 売上トランの売上区分が”1”の情報を元に、売上実績の売上日情報を更新するSQLの書き方を教えてください。
  • ORACLE環境がなく、ACCESSではうまく動作しないため、PL/SQLでの正しい処理結果が作成されるかどうか教えてください。
回答を見る
  • ベストアンサー

ORACLE UPDATE文の書き方について

いつもお世話になっています。 SQLのUPDATEについて、教えてください。 (例) 売上実績には、売上日を過去3回前まで保存しており、 売上トランの売上区分が”1”の情報を元に、売上実績の売上日情報を更新しています。 【売上実績】 │店舗│今 回│前 回│前々回│ ┼──┼───┼───┼───┼ │A店│12/05 │10/25 │10/01 │ │B店│11/15 │10/18 │09/05 │ │C店│11/30 │10/05 │09/15 │ │D店│12/01 │12/01 │11/01 │ │E店│12/07 │11/07 │10/07 │ │F店│11/18 │10/17 │08/11 │ 【売上トラン】 │店舗│売上日│売上区分│ ┼──┼───┼────┼ │A店│12/08 │ 1 │ ※繰越対象 │A店│12/08 │ 2 │ │B店│12/08 │ 2 │ │C店│12/08 │ 1 │ ※繰越対象 │D店│12/08 │ 2 │ │F店│12/08 │ 2 │ ーー結果ーー 【売上実績】 │店舗│今 回│前 回│前々回│ ┼──┼───┼───┼───┼ │A店│12/08 │12/05 │10/25 │ ※繰り越される │B店│11/15 │10/18 │09/05 │ │C店│12/08 │11/30 │10/05 │ ※繰り越される │D店│12/01 │12/01 │11/01 │ │E店│12/07 │11/07 │10/07 │ │F店│11/18 │10/17 │08/11 │ ※Keyは”店舗”  UPDATE 売上実績   Set 売上実績.今回 =        (Select 売上トラン.売上日 From 売上トラン           Where 売上トラン.店舗 = 売上実績.店舗 AND 売上トラン.売上区分= 1 ),     前回 = 今回,     前々回 = 前回       Where Exists ( Select 売上トラン.* From 売上トラン              Where 売上トラン.店舗 = 売上実績.店舗               AND 売上トラン.売上区分= 1 ) 上記処理をPL/SQLで行いたいのですが、正しい処理結果が作成されるのでしょうか? よろしくお願いします。 ※ORACLE環境がなく、ACCESSではうまく動作しなった為、質問させて頂きました・・・

  • Oracle
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

検証してみました。 いいと思います。

関連するQ&A

  • ORACLE UPDATEについて

    いつもお世話になっています。 SQLのUPDATEについて、教えてください。 (例) 各店舗の売上累積ファイルに、日ごとの売上トランの情報を累計する。 処理日が12月31日の場合、年次繰越を行う。 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│ 50000 │ 60000 │ │B店│ 25000 │ 32000 │ 売上トラン │店舗│本日売上│ ┼──┼────┼ │A店│ 25000 │ │B店│ 14000 │ ーー結果(12月31日の処理の場合)ーー 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│   0 │ 75000 │ │B店│   0 │ 39000 │ ーー結果(12月31日以外の場合)ーー 売上実績ファイル │店舗│当年売上│前年売上│ ┼──┼────┼────┼ │A店│ 75000 │ 60000 │ │B店│ 39000 │ 32000 │ ※Keyは”店舗”、実績とトランの関係は1:1 UPDATE 売上実績ファイル SET 前年売上 = CASE ( WHEN WK-処理日 = 12/31        THEN 売上実績ファイル.当年売上 + 売上トラン.本日売上        ELSE 売上実績ファイル.前年売上 ) SET 当年売上 = CASE ( WHEN WK-処理日 = 12/31        THEN 0        ELSE 売上実績ファイル.当年売上 + 売上トラン.本日売上 ) WHERE 売上実績ファイル.店舗 = 売上トラン.店舗 上記処理をPL/SQLで行いたいのですが、正しい処理結果は求まるのでしょうか? よろしくお願いします。 ※環境がなく、動作検証が出来ない為、質問させて頂きました・・・

  • ORACLEのUPDATEについて教えてください

    いつもお世話になっています。 以下の処理を実現するUPDATEの記述を教えて頂けないでしょうか? よろしくお願い致します。 (ORACLE9i、PL/SQLを想定しています) 【店舗T】に、【売上T】の売上区分が”2”のレコードを対象に、予定日が指定日より近い順に 最大5日分設定する。 ※対象となる【売上T】のレコードは、予定日が指定日以降のみ対象とする ※【売上T】は各店舗毎に、0件から数十件まで存在する。 ※【店舗T】の売上履歴は毎回クリアし、売上Tより求める 【店舗T】 │  │   売 上 予 定 情 報     │ │店舗│直近1│直近2│直近3│直近4│直近5│ ┼──┼───┼───┼───┼───┼───┼ │A店│   │   │   │   │   │ │B店│   │   │   │   │   │ │C店│   │   │   │   │   │ │D店│   │   │   │   │   │ 【売上T】 │店舗│予定日│売上区分│ ┼──┼───┼────┼ │A店│12/10 │ 2 │○対象 │A店│12/20 │ 2 │○対象 │A店│12/30 │ 1 │※売上区分が”1”の為、対象外 │A店│12/31 │ 2 │○対象 │  │   │    │ │C店│12/01 │ 2 │※指定日(12/10)より前の為、対象外 │C店│12/05 │ 2 │※指定日(12/10)より前の為、対象外 │C店│12/11 │ 2 │○対象 │C店│12/11 │ 1 │※売上区分が”1”の為、対象外 │C店│12/15 │ 2 │○対象 │C店│12/21 │ 2 │○対象 │C店│12/25 │ 2 │○対象 │C店│12/30 │ 2 │○対象 │C店│12/31 │ 2 │※5件を超えた為、対象外 │  │   │    │ │D店│12/15 │ 1 │※売上区分が”1”の為、対象外 │D店│12/18 │ 1 │※売上区分が”1”の為、対象外 ---12月11日の結果--- 【店舗T】 │  │   売 上 予 定 情 報     │ │店舗│直近1│直近2│直近3│直近4│直近5│ ┼──┼───┼───┼───┼───┼───┼ │A店│12/20 │12/31 │ │   │   │ │B店│   │   │   │   │   │ │C店│12/11 │12/15 │12/21 │12/25 │12/30 │ │D店│   │   │   │   │   │

  • UPDATE文を教えて頂けないでしょうか

    いつもお世話になっています。 以下の処理を実現するUPDATE文を教えて頂きたく、質問にあげさせて頂きました。 ※現在、処理を「実績登録用UPDATE」と「予定登録用UPDATE」のそれぞれ作成すれば  いけそうなのですが、1つのUPDATE文では実現出来ないでしょうか?  ・・・実績登録用は作成したので、最後に付けています 以上、よろしくお願いします。 【処理】 トランより店マスタの更新を行う。 ・トランの区分が”1"の場合は、店マスタの実績欄へトランの日付情報をセットする。  ※店マスタの実績日は過去3日分を累積している為、 実績2を実績3へ、実績1を実績2へ   移してから、トランの日付を実績1欄にセットする  ※区分”1”のレコードは、店コード毎に1件しか存在しない ・トランの区分が”2"の場合は、店マスタの予定欄へトランの日付情報をセットする。  ※店マスタの予定日は、当処理が実行される時点では既にクリアされており、毎回トランに存在する   直近3日分を予定欄へセットする  ※区分”2”のレコードは、店コード毎に複数件存在する) 例) トラン(キー:店CD・日付)  店CD 日 付 区分  ┼───┼───┼──┼ │ 0001 │01/10 │ 1 │→マスタの実績1に登録されます │ 0001 │01/15 │ 2 │ │ 0002 │01/20 │ 2 │→マスタの予定1に登録されます │ 0002 │01/30 │ 2 │→マスタの予定2に登録されます │ 0003 │01/10 │ 1 │→マスタの実績1に登録されます │ 0005 │01/10 │ 1 │→マスタの実績1に登録されます │ 0005 │01/20 │ 2 │→マスタの予定1に登録されます │ 0005 │01/30 │ 2 │→マスタの予定2に登録されます │ 0005 │02/10 │ 2 │→マスタの予定3に登録されます │ 0005 │02/20 │ 2 │→マスタにはMAX3件までしか登録出来ないのでスキップ │ 0005 │03/01 │ 2 │→マスタにはMAX3件までしか登録出来ないのでスキップ マスタ(キー:店CD)  店CD│実績1 実績2 実績3│予定1 予定2 予定3│ ┼───┼───┼───┼───┼───┼───┼───┼ │ 0001 │01/05 │12/30 │12/25 │ │ │ │ │ 0002 │12/30 │12/15 │11/30 │ │ │ │ │ 0003 │01/01 │12/20 │12/10 │ │ │ │ │ 0004 │01/07 │01/06 │01/05 │   │ │ │ │ 0005 │01/01 │12/20 │12/10 │ │ │ │ 【希望する結果】  店CD│実績1 実績2 実績3│予定1 予定2 予定3│ ┼───┼───┼───┼───┼───┼───┼───┼ │ 0001 │01/10 │01/05 │12/30 │01/15 │ │ │ │ 0002 │12/30 │12/15 │11/30 │01/20 │01/30 │ │ │ 0003 │01/10 │01/01 │12/20 │01/07 │ │ │ │ 0004 │01/07 │01/06 │01/05 │   │ │ │ │ 0005 │01/10 │01/01 │12/20 │01/20 │01/30 │02/10 │ ■実績更新用UPDATE UPDATE マスタ SET ( 実績1,実績2,実績3 )=( SELECT 日付,MAX(TRN.実績1),MAX(TRN.実績2),MAX(TRN.実績3) FROM マスタ LEFT JOIN トラン TRN ON 店CD = 店CD WHERE 区分 = 1 GROUP BY トラン.店CD, トラン日付) WHERE EXISTS( SELECT 'TRUE' FROM マスタ WHERE マスタ.店CD = トラン.店CD AND マスタ.日付  = トラン.日付 AND トラン.店CD = 1 );

  • ORACLE UPDATE・INSERTについて

    いつもお世話になります。 ORACLE9i・PL/SQL上で複雑!?なUPDATE&INSERTがあり、それぞれを別々に 処理することにはしました。 ただ、UPDATE、INSERTをそれぞれ一回で完了させるSQLが掛けません (私には複雑すぎるので・・) どなたか以下の処理を実現する、UPDATE文、INSERT分を教えて頂けないでしょうか? 例) 店舗別の【予算T】があります。 ・予算額欄が、ゼロの場合、UPDATEを行う  (1)【店舗M】の「業種区分」を求める  (2)「業務区分」より、【業務分類】の「予算G」を求める  (3)「予算G」より【グループ別予算】の予算額を求める  (4)求めた予算額で、【予算T】の「予算額」を更新する。 ・【予算T】に存在しない店舗の予算レコードのINSERTを行う  (1)【予算T】に存在しない店舗の「業種区分」を【店舗M】より求める  (2)「業種区分」より【業務分類】の「予算G」を求める  (3)「予算G」より【グループ別予算】の予算額を求める  (4)求めた予算額、店舗の情報を【予算T】にレコード登録する。 【予算T】 │店舗│予算額│ ┼──┼───┼ │A店│ 5000 │ │C店│ 0000 │ │D店│ 3500 │ 【店舗M】 │店舗│コード│業務区分│ ┼──┼───┼────┼ │A店│00001 │001   │ │B店│00002 │001   │ │C店│00003 │003   │ │D店│00004 │003   │ │F店│00030 │002   │ 【業務分類】 │業務区分│予算G│ ┼────┼───┼ │ 001  │ A │ │ 002  │ A │ │ 003  │ B │ │ 004  │ C │ 【グループ別予算】 │予算G│予算額│ ┼───┼───┼ │ A │10000 │ │ B │05000 │ │ C │05000 │ │ D │03000 │ ーー結果ーー ・UPDATE 【予算T】 │店舗│予算 │ ┼──┼───┼ │A店│ 5000 │ │C店│ 5000 │ │D店│ 3500 │ ・INSERT後(最終結果) 【予算T】 │店舗│予算 │ ┼──┼───┼ │A店│ 5000 │ │B店│10000 │ │C店│ 5000 │ │D店│ 3500 │ │F店│10000 │

  • Oracleのupdate文について

    OracleでテーブルB、Cを結合し取得できた項目で、テーブルAを更新したいのですがSQLがわかりません。結合結果とテーブルAは1:1にはなりません。 件数が結合結果>テーブルAの時もあれば、その逆の場合もあります。また、複数項目を更新したいです。実行して考えてみたいのですが、明朝客先ですぐに実行しなければならず(テスト環境はあるので明日そこで一旦確認後、すぐに本番環境で実行)、現在移動中→ホテル泊のため余裕がありません。 ネットで下記を見つけたのですが、更新する項目に更新日時を追加したいのと、テーブルAとの紐付けやEXISTSのWHEREはテーブルBとC両方の項目に紐づけたいです。 また、テーブルAの更新条件に、テーブルB、Cにはないcolumn③に対する条件も追加したいです。 UPDATE [TABLE①] A SET (COLUMN①, COLUMN②) = ( SELECT B.COLUMN, C.COLUMN FROM [TABLE②] B, [TABLE③] C WHERE B.COLUMN = C.COLUMN AND B.COLUMN = A.COLUMN ) WHERE EXISTS ( SELECT 1 FROM [TABLE②] B2 WHERE B2.COLUMN = A.COLUMN) もろもろとわかりづらい説明&他力本願で心苦しいのですが、どなたか教えていただけないでしょうか?

  • PL/SQL 条件アップデートについて

    PL/SQLを使用して、条件に合致するレコードのみをアップデートしようとした場合 この条件が他のテーブルを参照しなければいけない時どのようなロジックで実現できるでしょうか? 例えば下記のようなアップデート対象テーブルがあります。 トランT 取引先| 年月 |店舗区分1 |売上  AAA   201105     1     10000 マスタT 取引先| 開始日 | 終了日  AAA   20100501  20110608 トランTは月別店舗別の売上を管理しているテーブルで マスタTは店舗の休業日数を管理いているマスタテーブルになります。 更新を行いたいのはトランTのフィールド「店舗区分1」でその条件は 前年同月に休業日が発生している店舗の「店舗区分1」を'2'に変更したい場合どのようにすれば これを実現できるでしょうか? やり方は複数あると思うのですがPL/SQLで実現できればと思っています。 しかし、PL/SQL初心者の為これに必要なコマンドや関数などがわかりません。 調べてみてもこのようなケースのサンプルなどが無く困っています。 どなたか詳しい方がいればご教示頂きたく存じます。 よろしくお願いします。

  • Mysqlのupdate文

    Mysql3.23.42+PHPで下記のようなテーブルで Field| Type ----+------------  a | int  b | varchar  c | varchar  d | timestamp  e | timestamp update文を実行すると、 例  update set b='あ',c='い',e=NULL where a='1'; dまでアッデートされてしまうのですが何ででしょう? 何か特別なことしなくてはいけないのでしょうか?

  • エクセルの値の照合

    エクセル初心者です。宜しくお願いしますm(__)m 各店舗の売上の入金確認作業を行っています。 シート1と、シート2と照合し、A・B・D・E列が同じ値であれば、シート1から行ごと削除したいのですができますでしょうか。 ※C列は、入金があった際に日付が入ります。 G列は、確認をした際に日付が入ります。 シート1   A    B     C     D      E      F     G  ・・・ 1 店舗   日付   入金日  売上額   手数料  担当   確認日 2 A店   1/5   未収     \10,000   \2,000  田中   3 B店   1/6   未収     \20,000   \4,000  長谷 シート2   A    B     C     D      E      F     G  ・・・ 1 店舗   日付   入金日  売上額   手数料  担当   確認日 2 A店   1/5   2/5     \10,000   \2,000  田中   2/10 3 B店   1/6   2/8     \20,000   \4,000  長谷   2/10 宜しくお願いします!!

  • SUMPRODUCT 複数条件設定で、計算式結果がおかしいです。

    下記のような表があったと仮定します。   A  B   C   D 1 月度 店舗 品目 売上金額 2 4   A   あ  22300 3 4   B   あ  18700 4 4   C   あ  14500 5 4   A   い  17950 6 5   B   あ  44000 7 5   C   い  35000 8 5   A   う  12000 9 5   B   い  13400 この表から、 店舗「A」、品目「あ」の売上合計は、22300になり、 数式「=SUMPRODUCT(($B$2:$B$9="A")*($C$2:$C$9="あ")*$D$2:$D$9)」で計算できます。 店舗「A,B」、品目「あ」の売上合計は、85000になり、 数式「=SUMPRODUCT(($B$2:$B$9={"A","B"})*($C$2:$C$9="あ")*$D$2:$D$9)」で計算できます。 店舗「A」、品目「あ,い」の売上合計は、40250になり、 数式「=SUMPRODUCT(($B$2:$B$9="A")*($C$2:$C$9={"あ","い"})*$D$2:$D$9)で計算できます。 しかし、 店舗「A,B」、品目「あ,い」の売上合計は、116350なのですが、 数式「=SUMPRODUCT(($B$2:$B$9={"A","B"})*($C$2:$C$9={"あ","い"})*$D$2:$D$9)」では、数値がおかしく(35700に)なります。 数式の使い方が間違っているのでしょうか? アドバイスをお願いします。

  • 複雑なUPDATE文2

    先に質問をさせていただき、1度は解決したものの再び行き詰ってしまいました。 UPDATEの際うまくいかず困っています。 お知恵を拝借いただけると助かります。 使用バージョンはPostgresV7.3.4です。 tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 (★) 1 | 1 | 0| 1 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 3 | 2 | 1| 1 (★) 3 | 2 | 0| 1 3 | 1 | 0| 1 b=1 and c=1 で一致する行を★行とする。 ★行のa1列の値とa2列の値(上記の例だと(a1=1,a2=1)と(a1=3,a2=1))をもつ行に対して 下記の条件◆でUPDATEを行う。 [条件◆] b=0 and c=1 [UPDATEの内容] 条件◆に一致したc列を3に更新する [理想の結果] tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 1 | 1 | 0| 3 ←更新 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 ←★にあてはまらないので更新されない 3 | 2 | 1| 1 3 | 2 | 0| 3 ←更新 3 | 1 | 0| 1 ←最下行 ========================================== UPDATE tableA set c = 3 WHERE 条件◆ and a1 in (select a1 from tableA where b=1 and c=1) and a2 in (select a1 from tableA where b=1 and c=1) このようなイメージなのですが、この場合、 最下行のc列も更新してしまいました。 (説明しずらいのですが、) a1とa2の条件は独立させるのでは無く、セットとして考えたいのですが、 方法が分りません。 ご協力お願いします。 ==========================================