• 締切済み

updateについて(SQL)

こんばんわ。現在、oracle8i,SQLを勉強中で基本的な事はできるようになったのですが、わからない所が出てきたのでよろしくお願いします。 売上票 年月日 当日売上 前日売上 ------------------------ 2000/04/11 100 2000/04/10 150 2000/04/09 90 2000/04/08 120 このようなテーブルがある時に前日売上に一つ前のレコードの当日売上の値を更新したいのですが、そのような事をSQL文(1文)で実現することはできるのでしょうか?updateするときに一つ前のレコードの値を取得することは出来るのでしょうか?いろいろとサイトを回って探してみたのですが、該当レコードの値を操作するものはみつかったのですが、他のレコードを操作するものは見つかりませんでした。 よろしくお願いします。見当違いな質問でしたらお許し下さい。

  • aleck
  • お礼率85% (40/47)
  • Oracle
  • 回答数5
  • ありがとう数16

みんなの回答

回答No.5

>なにか一つ前のレコードを指定できるものがあるかと思っていました。 別に不可能なわけではない。 効率の問題はあるけど、次のようなSQLで更新できるハズ。 update 売上票 x set 前日売上 = ( select y.当日売上 from (select * from 売上票 order by 年月日 desc) y where y.年月日 < x.年月日 and rownum=1 ) ; ただ、処理効率を落としてまで、前日売上を同一レコード上に 管理する必要があるか?というところで、検討の余地があるかと思います。

回答No.4

おそらく、質問者の 「前日」 とは 「直近の営業日」 ってことでは? TSUTAYAのようなところであれば、「-1」で納得

aleck
質問者

お礼

お礼が遅くなり申し訳ありません。今回は参考書にのっていた例題をやりながらふと疑問に思い、質問させていただきました。実際の現場ではそのようなことも含めて考えていかなければならないのですね。勉強になりました。ありがとうございました。

回答No.3

テーブル設計の善し悪しについては、話を棚上げして、 技術的に可能かどうかだけ書きますが... >そのような事をSQL文(1文)で実現することはできるのでしょうか? >updateするときに一つ前のレコードの値を取得することは出来るのでしょうか? update 売上票 x set 前日売上 = (select y.当日売上 from 売上票 y where y.年月日 = x.年月日 - interval '1' days) とかで良いのではないでしょうか。(未検証ですが)

aleck
質問者

お礼

お礼が遅くなり申し訳ありません。やはりそのように、whereで一日マイナスして指定するという風になるのですね。なにか一つ前のレコードを指定できるものがあるかと思っていました。まだまだ勉強が足りないようです。ありがとうございました。

回答No.2

「年月日/当日売上/前日売上」というテーブル定義を見直しましょう。 「年月日/当日売上」であるべきです。 データの見せ方とデータの持ち方を混同すると、頭の悪そうなデータ設計になってしまいますよ。

aleck
質問者

お礼

早速の回答ありがとうございます。設計自体に問題があるのですね。言われてみればその通りですね。ですからサイトを探しても見つからないわけですね。 もしこのようなことを無理矢理やろうと思えば「年月日/当日売上/前日売上」から「当日売上」をひとつずらして取得しそれを結合という形にせざるを得ないということでしょうか?

回答No.1

やってやれないことはありませんが、、、 入れ子のFrom句内に、データとって云々。。。 って感じになると思うのですが、、、 それよりも、テーブルのカラムとしての必要性が感じないです。 複雑な前日値取得部のFunctionを作成して、クエリなどで1カラムにはめるだけで、前日参照が可能だと思いますよ。

aleck
質問者

お礼

早速の回答ありがとうございます。#2の方が言われているように、設計自体に問題があるのですね。ですから検索しても出てこないのですね。まだまだ勉強が足りないようです。ありがとうございました。

関連するQ&A

  • SQLを教えてください

    MS-ACCESSにて以下のような条件のSQLを教えてください 年月日、数量の2つのカラムがあります 年月日 数量 1/1  100 1/2  150 1/3  120 1/4  200 年月日には、順番に年月日が入っています 数量には、いろいろな数値が入っています ここで年月日の最新200件のレコードで ......select top 200 order by 年月日 desc 当日の数量が前日の数量より大きいものの数と小さいものの数 .......count(*) where 当日の数量 > 前日の数量 where 当日の数量 < 前日の数量 例の場合だと 1/2は1/1の数量より大きい 1/3は1/2の数量より小さい 1/4は1/3の数量より大きい 結果としてカウントした値は 大きい=2 小さい=1 を求めたいと思います ひとつのSQLで、できればいいのですが 大きいのひとつ 小さいのひとつ の二つのSQLでもいいです よろしく、お願いします

  • Access 1レコード前の情報を取得

    Access2003でSQLクエリを用い、カレンダーリスト(テーブル名:T_カレンダー)の作成をしております。 カレンダーには、年月日、売上金、前日売上金、などの項目があります。 Tカレンダテーブルの内容 年月日 売上金 ■目的 「前日売上金」 に、 1レコード前、もしくは前日以前のレコード(※)の 「売上金」 のデータを格納したい。 ※前日以前のレコードとしたいのは  カレンダーですので、年月日も営業日などの関係で、  土日のデータなどは0円になることがあります。 (ちなみにデータ値がない場合は0を既定値でセット) その為、前日の売上金が0円だった場合、 最後の営業日の売上金データがあったもの(0円以外のもの)を持って来たいと考えています(※2)。 基本、+(プラス)値となりますが、-(マイナス)値も抽出したいと考えています。 ■ためしに SELECT t1.年月日, t1.売上金, t2.年月日, t2.売上金 AS 前日売上金 FROM Tカレンダ AS t1 LEFT JOIN Tカレンダ AS t2 ON t2.年月日 = DateAdd("d",-1, t1.年月日) ORDER BY t1.年月日; こんなSQLを組んでみました。1日前のデータは抽出できたのですが ※2の内容がどう組んでよいか、わかりません。 どうか、ご教授願います。 宜しくお願いいたします。

  • SQLについて

    レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • 集計のSQL文を教えてください

    集計で困っています。 助けてください。 uriage_date(date型) uriage_kingaku 2005/01/01 00:15   2000 2005/01/01 12:20   2500 2005/01/02 00:00   1000 ←ここは前日分(2005/01/01)に 2005/01/02 05:15   1800 2005/01/04 12:30   2300 ~ 2005/12/31 20:20   5000 2005/12/31 22:45   1200 上の様なテーブルから 売上合計(1月分) uriage_date     goukei_kingaku 2005/01/01      5500 2005/01/02      1800 2005/01/03      0 ~ 2005/01/31      9000 この様に1日毎(当日00:01~翌日00:00)の売上の合計金額 を一ヶ月単位で集計したいのですが、SQL文が解りません。 00:00の売上は前日の合計に入れたいです。 データの無い日も0円として欲しいです。 よろしくおねがいします。

  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • AccessのSQLについて教えてください。

    Excel+VBA から、ADOを使って、Accessを操作しようとしています。 なんとか、sqlを実行できるようになったのですが、 一点、分からないところが出てきましたので、教えてください。 insert文で、レコードを追加したとき、追加されたレコードのIDを取得したいのですが、 どのようにすれば良いかわかりません。 コードは次のようにしています。 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & データベース名 & ";" sql = "INSERT INTO テーブル名(フィールド) VALUES(値)" cnn.Execute sql 以上、すみませんが、よろしくお願いいたします。

  • SQLを教えて下さい

    SQL server 2008 R2 と VB2010 で開発を行っています。 いま、月別の合計金額を計算するSQLがわからなくて困っています。 【売上明細テーブル】 ・明細ID ・年月日 ・得意先ID ・売上金額 出力したい内容は以下のような月別売上合計の推移です。 具体的にはこんな感じです。 得意先ID 3月売上 4月売上 5月売上 --------------------------------------- 0001     1,111   2,222   3,333 0002     2,222   3,333   4,444 0003     5,555     0    6,666 得意先の中には売上の無い月もあります(0003の4月)が、 この場合も一覧に出したいと考えています。 1つのロウの中に異なる条件の値がある場合のSQLの組み立てがわかりません。 どうぞ宜しくお願いします。

  • SQL文を教えてください

    A B C --------- 11 22 33 44 55 33 上記のように、同じ値を持つレコードが2件以上あるC列の値を取得するにはどのようなSQL文にすればよいでしょうか。 よろしくお願いします。

  • 集計のSQL文について

    SQLでの集計方法について質問です。 Oracle8iを使用しています。 あるテーブルに以下のようなレコードがあります。 ID 回数 値 1   1  100 1   2  200 1   3  300 2   1  150 2   2  550 .... この登録されている値をそのIDごとに、その回数まで回数ごとにサマリーした結果を出力したいのですが どうすればよいでしょうか。 ID 回数 値 1   1  100  ・・・(100) 1   2  300  ・・・(100+200) 1   3  600  ・・・(100+200+300) 2   1  150  ・・・(150) 2   2  700  ・・・(150+550) 宜しくお願いします

  • SQL操作のC#書き換え

    よろしくお願いします。 現在勉強のため、SQLとC#をやっています。 課題として出されたものが、 AテーブルのデータをTRUNCATEを使って 全削除するSQL文を、 C#を使って全く同じ操作ができるようにする、 要するにSQL文をC#に書き換える といったものが出ました。 正直初心者なので見当もつきません。 どうかご助力お願いします。