• 締切済み

ACCESS2000で最大値のレコードを取り出したいです。

マイクロソフト ACCESS2000 についての質問です。 何万行かの受注データがある中で、顧客ごとに  ・最初に購入した受注レコード  ・最後に購入した受注レコード をそれぞれ出したいと思っています。 MAX関数やMIN関数を使うのかと思いましたが、 なかなかうまくいかず・・・ 最近SQLを学び始めたためどうもよくわかりません。 どなたか力を貸してください。 よろしくお願いします。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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でも複雑なクエリは苦手と言う人が結構 いますが、こう言う論理の組み立てができないから なのです。クエリを考える時は先ず、論理の組み立て から行うようにしてください。

manuelruic
質問者

お礼

回答ありがとうございます。 おかげさまで出来ました。 考え方からの詳しい説明ありがとうございました。 また何かありましたらよろしくお願いいたします。 > ベテランSEでも複雑なクエリは苦手と言う人が結構 > いますが、こう言う論理の組み立てができないから > なのです。クエリを考える時は先ず、論理の組み立て > から行うようにしてください。 意識しようと思っているんですが、今まであまりしてこなかったせいか まだまだ出来ないですね。 これから頑張ります。

関連するQ&A