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

Access97のVBAで開発を行っています。SQLでデータの抽出で、あるフィールドの最大値を条件に指定して抽出する方法を教えてください。最大値という曖昧な条件なため、悩んでいます。

(例)ある学校の成績テーブル(左から、学籍番号,組,氏名,性別,科目,点数)

0103,鈴木,男,国語,95
0103,鈴木,男,数学,40
0103,鈴木,男,英語,80
0104,高橋,男,国語,45
0104,高橋,男,数学,85
0104,高橋,男,英語,55

|(SQLで各人の最高点のデータのみ抽出したい)

(抽出結果)
0103,鈴木,男,国語,95
0104,高橋,男,数学,85

知っている方、是非教えてください。
お願いします。

A 回答 (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("氏名")等の必要な情報を必要に応じて操作すれば
よろしいのではないでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/02/15 11:56

select * from 成績


where (氏名,点数) in
( select 氏名, max(点数) from 成績 group by 氏名);

で正しい答えが返ってくるのでしょう。
違っていたらごめんなさい。
    • good
    • 1
この回答へのお礼

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

お礼日時:2001/02/15 11:59

 業務で行っていると判断しました(違ったら補足下さい)。



 上記の理由から、ヒントだけ...。

 MAX() 関数かORDER BYを使うと比較的簡単に抽出出来ます。

 ちょっと凝った作りになっていると、一度全部を表示するクエリーを作成して、その後Maxを使用して最大値を表示するクエリーを作った方が処理時間が短くなります。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A