アプリ版:「スタンプのみでお礼する」機能のリリースについて

マイクロソフト ACCESS2000 についての質問です。

何万行かの受注データがある中で、顧客ごとに

 ・最初に購入した受注レコード
 ・最後に購入した受注レコード

をそれぞれ出したいと思っています。

MAX関数やMIN関数を使うのかと思いましたが、
なかなかうまくいかず・・・

最近SQLを学び始めたためどうもよくわかりません。
どなたか力を貸してください。

よろしくお願いします。

A 回答 (1件)

「人間的な表現」はコンピュータに分かりません。


子供にお使いを頼む時のように、全て具体的な
指示と「子供にも分かる」表現が必要です。
「大人の」表現で「子供に」理解させるのは
チョット無理でしょう?

>最初に
普通は時間的に見て「古い方」となりますが、
受注レコードには「購入日」と言ったフィールドが
あるのでしょうか?
仮にあるとすると、「最初に購入した受注レコード」
ではなく「一番小さい購入日を持つ受注レコード」と
表現し直すべきです。つまり、MaxやMinという関数が
あるということは「一番大きい」「一番小さい」という
言葉は通じると言うことです。このような「翻訳」が
直ぐにできるように訓練してください。
AccessにはFirst、Lastという関数もありますが、
他のDBシステムにはありませんし、記録した順序が
日付に比例するとも限りませんので、適当では
ありません。
さて、問題はここからで、「一番小さい購入日」は
Min関数で求められるのですが、購入日であって、
受注レコードではありません。
従って、「一番小さい購入日を求める」クエリと
「購入日」が一致するレコードを求めると言う動作が
必要になります。正しい表現は以下の様になります。
「一番小さい購入日と同じ購入日を持つ受注レコード」

実際のSQL例
SELECT A.* FROM 受注テーブル AS A INNER JOIN
(SELECT Min(購入日) AS 最小 FROM 受注テーブル) AS B
ON A.購入日=B.最小

2行目のカッコの中が「一番小さい購入日を求める」
クエリで、こういうのをサブクエリと呼びます。
難しければ、これを独立したクエリとして登録しても
良いでしょう。INNER JOIN で、これと「結合する」を
示し、「何をもって合わせるか」はON句でレコードの
「購入日とサブクエリの最小が等しい」と表現します。

ベテランSEでも複雑なクエリは苦手と言う人が結構
いますが、こう言う論理の組み立てができないから
なのです。クエリを考える時は先ず、論理の組み立て
から行うようにしてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おかげさまで出来ました。
考え方からの詳しい説明ありがとうございました。
また何かありましたらよろしくお願いいたします。

> ベテランSEでも複雑なクエリは苦手と言う人が結構
> いますが、こう言う論理の組み立てができないから
> なのです。クエリを考える時は先ず、論理の組み立て
> から行うようにしてください。

意識しようと思っているんですが、今まであまりしてこなかったせいか
まだまだ出来ないですね。
これから頑張ります。

お礼日時:2010/01/29 18:44

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