• 締切済み

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

  • ACCESSのモジュールで

    おはようございます。 Access97で受注管理データベースを作成しています。 新規顧客コード作成の際、いくつかの条件でコードを分けています。 そのためSQLで抽出し、それに1を足して新規コードとしています。 たとえば下記のSQL文を書き、 mySQL="SELECT Max(顧客コード) AS 顧客コードの最大 FROM 顧客マスタ GROUP BY グループ HAVING (グループ='CB');" その抽出結果を取得したいのですが、そのためにはレコードセットとみなさせるのかと思い、いろいろやってみたのですが、結局出来ません。(それからして怪しい) VBAお勉強中で根本的に仕組みを理解できていないせいだと思うんですが、 数冊参考書を見ても分かりませんでした。 分かりにくい質問文ですみません。どなたか助けてください。よろしくお願いします。

  • 日付の最大値レコードを取得する方法について

    お世話になります。 SQLで日付の最大値を取得する方法です。 テーブルのデータ内容は以下のようになっています。 | 社員番号 | 社員名 | 日付 | 順序 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 1 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/04/01 | 1 | +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 1 | +---------+-------+-----------+-----+ 取得したいレコードは、 社員ごとの最大日付の最大順序をもつレコードです。 (上記の1行目と4行目のレコードを取得したい) この場合、 下記のようなSQLを考えます。 --------------------------------- SELECT 社員番号, 社員名, 日付 FROM テーブル名 WHERE 社員番号 = 'xxx' AND 日付 = (SELECT MAX(日付) FROM テーブル名 ) AND 順序 = (SELECT MAX(順序) FROM テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。

  • ACCESS のサブフォーム表示について

    ACCESS のサブフォーム表示について 環境 ACCESS2003 テーブルが2つあります 1、 TBL顧客情報 2、 TBL購入品 TBL顧客情報をメインにTBL購入品をサブフォーム にして受注フォームを作りたいと思います 以下3つのことを望んでいます 1、サブフォームに購入品を加えてたいのですが 追加できる行を3行までと制限を掛けたい。 2、受注フォームを開いたときサブフォームには 空の3行が表示されている 3、ですのでTBL購入品には記入した購入品がのみが 追加され、空の行は無視される。 どなたかお知恵を拝借させてください。

  • Accessの新しいレコード

    すいません、教えてください。 英語の講師をしてます。 昨年度までのセンター試験の問題をAccessに入力して管理しているのですが、その表に今年のデータを入力しようとしています。 新しいレコード(今年の問題)を表のいちばん上(IDがいちばん若いところ)に入れたいのですが、入りません。新しいレコードを入れようとすると、自動的にいちばん下の、IDが最も大きいところに入ってしまいます。ワードのように行挿入というのが見あたりませんし、コピペで差し込もうとすると前のデータが消えてしまいます。 なんとかIDのいちばん若いところに新しいデータを入力することはできないでしょうか。 すいませんが、教えてください。

  • Access レコードロックについて教えてください

    現在稼働中の受注管理システムに発生データの登録、管理を行っておりますが、既登録データを呼び出し、追加情報の入力する際等のタイミングで、登録済みの顧客や商品を何だかのミス操作で全く別のレコードに書き換えてしまうケースがあり困っています。 排他制限も考慮しましたが、意向に添わずの状況です。 排他制限ではなく、レコード毎に例えばチェックを入れるだけで安易な書き換え止め、チェックを外せば追加変更ができる様な仕組みは可能でしょうか。 宜しくお願いします。

  • ACCESS2002、レコードのインポートができません!

    初心者です、よろしくお願いします。 ■ 仕様環境 WinXP Access2002 アクセス2002で顧客管理システムを作ってます。 アクセスAのテーブルにアクセスBのテーブルをインポートする時、 レコードだけインポートできないのでしょうか? どうしても違うテーブルが作られてしまいます。 例えば・・ アクセスAに「住所」という項目があり、そこには既にレコードが 何件か入っているのですが、そこにアクセスBの「住所」のレコードを追加したいのですが、 うまくいきません。そういう機能はついていないのでしょうか? また、アクセスBの情報をエクセルファイルに変えて「次のテーブルに保存する」で インポートしたのですが、最後の「完了」ボタンを押すと「エラーが発生し、 インポートできませんでした」という表示がでてインポートできません。 同じように電話番号や名前、メールアドレス等もアクセスAに追加したいのですが、 一つ解決しないと先に進まない気がするのでとりあえず住所だけにしぼってみました。 データを”追加”するような感じでしたいのです! 誰かお知恵を貸してください!

  • MySQLで一番最後のレコードをしる関数って?

    MySQLで一番最後のレコードを知る関数ってありますか? noや時間情報のソートの最初の値ではなく、簡単に最後に追加したレコードを取得する方法。 ないなら、方法としてはレコード数をカウントして、全カウント数番目をselectすればいいんでしょうか? SQLには、最後とかの概念がないかな?

    • ベストアンサー
    • MySQL
  • Accessレポートの質問です。

    Access2010のレポートで複数レコードのデータを1行に出力しようとしています。 具体的には各レコードに顧客名と金額がはいっており、 それを以下のように印刷したいと考えてます。   顧客1 10,000   顧客2 20,000 顧客3 30,000 顧客4 40,000  顧客5 50,000 合計 5件 150,000 VBAを使って処理すれば、できるのかもしれませんが、VBAでレポートを作成した ことがないので止まっています。(フォーム内でのデータ処理でVBAを使ったこと はありますが) どなたか知恵をお貸しいただければ幸いです。 宜しくお願いいます。

  • excelで決まった間隔の最大最小を求める

    excelで縦に1分おきのデータが並んでいます。 これを100行ずつくくってその範囲の最大、最小を求め 以後それを繰り返し行いたいのですが方法がわかりません。 =MIN(A1:A100) でそれ以降を=MIN(A1+100:A100+100)の ような感じにはいかないのでしょうか? いい方法があれば教えて下さい。 例)1日100個のデータがあります。その中からMIN/MAXを選んで 以降毎日のMIN/MAXのデータのみを抽出してグラフ化したい。

  • Accessで最小値と最大値を一度で取得する方法

    OS:WinXP Access:2000 下記の状態にしたいのですが よいSQL文が思いつきません。 MINのみのデータを抽出する方法は分かるのですが select ID,Name,Min(Date) from tblA group by ID,Name,Date MAX(Date)も出力しようとすると、Dateが最小のNameの出力方法が分かりません。 テーブル(tblA) ID|Name|Date --------------- 01|C |8/10 01|A |8/11 01|B |8/12 ↓ クエリ実行後 ID|MIN(Name)|MIN(Date)|MAX(Date) ----------------------------------- 01|C |8/10 |8/12 よろしくお願いいたします。