• ベストアンサー

あるフィールドの最大値を条件にデータを抽出する方法

Access97のVBAで開発を行っています。SQLでデータの抽出で、あるフィールドの最大値を条件に指定して抽出する方法を教えてください。最大値という曖昧な条件なため、悩んでいます。 (例)ある学校の成績テーブル(左から、学籍番号,組,氏名,性別,科目,点数) 0103,鈴木,男,国語,95 0103,鈴木,男,数学,40 0103,鈴木,男,英語,80 0104,高橋,男,国語,45 0104,高橋,男,数学,85 0104,高橋,男,英語,55 | |(SQLで各人の最高点のデータのみ抽出したい) ↓ (抽出結果) 0103,鈴木,男,国語,95 0104,高橋,男,数学,85 知っている方、是非教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

クエリーを使えば比較的楽に出来るでしょうがひとつのSQLでやるのは少々難しいように思います。 そこで、SQLを二回に分けて結果を出してはどうでしょうか。 最初に学籍番号と点数だけで「SELECT 学籍番号, Max(点数) AS 最高点 FROM 成績テーブル GROUP BY 学籍;」とし、個人別の最高点を抽出します。 そして、それをもとに「SELECT * FROM 成績テーブル WHERE 学籍番号 = 最高点のSQLの学籍番号 AND 点数 = 最高点のSQLの最高点;」とし、必要なほかの情報(氏名、性別、科目)を持ってきます。 【例】 Dim db As database Dim rs1 As recordset Dim rs2 As recordset Set db=CurrentDb Set rs1=db.OpenRecordset("SELECT 学籍番号, Max(点数) AS 最高点 FROM 成績テーブル GROUP BY 学籍;",dbOpenDynaset) rs1.MoveFirst Set rs2=db.OpenRecordset("SELECT * FROM 成績テーブル WHERE 学籍番号 = '" & rs1("学籍番号") & "' AND 点数 = " & rs1("最高点") & ";",dbOpenDynaset) rs2.MoveFirst 後はrs2("学籍番号")、rs2("氏名")等の必要な情報を必要に応じて操作すれば よろしいのではないでしょうか。

seyatomo
質問者

お礼

2つのレコードセットを使って操作する方法があったのですね。 早速試してみようと思います。ありがとうございました。

その他の回答 (2)

  • pcg733
  • ベストアンサー率78% (11/14)
回答No.2

select * from 成績 where (氏名,点数) in ( select 氏名, max(点数) from 成績 group by 氏名); で正しい答えが返ってくるのでしょう。 違っていたらごめんなさい。

seyatomo
質問者

お礼

MAXを使うんですね。クエリーでちょっとやってみたいと思います。 ありがとうございました。

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

 業務で行っていると判断しました(違ったら補足下さい)。  上記の理由から、ヒントだけ...。  MAX() 関数かORDER BYを使うと比較的簡単に抽出出来ます。  ちょっと凝った作りになっていると、一度全部を表示するクエリーを作成して、その後Maxを使用して最大値を表示するクエリーを作った方が処理時間が短くなります。