プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (5件)

>なにか一つ前のレコードを指定できるものがあるかと思っていました。



別に不可能なわけではない。
効率の問題はあるけど、次のようなSQLで更新できるハズ。

update 売上票 x
set
前日売上 =
(
select y.当日売上
from (select * from 売上票 order by 年月日 desc) y
where y.年月日 < x.年月日 and rownum=1
)
;

ただ、処理効率を落としてまで、前日売上を同一レコード上に
管理する必要があるか?というところで、検討の余地があるかと思います。
    • good
    • 0

おそらく、質問者の


「前日」
とは
「直近の営業日」
ってことでは?

TSUTAYAのようなところであれば、「-1」で納得
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/19 00:36

テーブル設計の善し悪しについては、話を棚上げして、


技術的に可能かどうかだけ書きますが...

>そのような事をSQL文(1文)で実現することはできるのでしょうか?
>updateするときに一つ前のレコードの値を取得することは出来るのでしょうか?

update 売上票 x
set
前日売上 =
(select y.当日売上 from 売上票 y where y.年月日 = x.年月日 - interval '1' days)

とかで良いのではないでしょうか。(未検証ですが)
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/19 00:35

「年月日/当日売上/前日売上」というテーブル定義を見直しましょう。


「年月日/当日売上」であるべきです。

データの見せ方とデータの持ち方を混同すると、頭の悪そうなデータ設計になってしまいますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/13 03:06

やってやれないことはありませんが、、、



入れ子のFrom句内に、データとって云々。。。
って感じになると思うのですが、、、

それよりも、テーブルのカラムとしての必要性が感じないです。

複雑な前日値取得部のFunctionを作成して、クエリなどで1カラムにはめるだけで、前日参照が可能だと思いますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/13 03:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!