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

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

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

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVSAM,QSAM,BSAM,BPAM,BDAM

データセット編成とアクセス法に関してですが、それぞれ、どのようなデータセットとして使われることが多いですか?データを入れるとか…、プログラムを入れるとか…。

Aベストアンサー

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAMはVSAMアクセスの動作方式のことで
す(プログラム中では意識する必要ありません)。

> BDAMはディスクか???
これもアクセス方式ですね。目的レコードの相対アドレ
スを指定してアクセス(READ/WRITE)する方式です。

> DBやJCL、ファイルを入れる場合はBPAMか?
DBは別物です。JCL、プログラム等が格納されるファイル
の形式(編成)がBPAMです。

> ボリュームという言葉があるけれど、データ編成で考えてはいけないのか?
ボリュームとは例えば磁気テープ1本、磁気ディスク1
スピンドルといった補助記録媒体の単位です。
→ 磁気ディスクには1ボリューム中に複数の異なる
  データ編成のファイルを作成可能です。

> ボリュームはどのようにできているのか?
VTOCおよびデータ領域です。

> ボリュームより大きいものはなんと言うのか?
通常ボリュームグループという概念があります。
→ この概念が無いとマルチボリュームファイルは作成
  できませんから・・・。

> 機能は、ちゃんと読んでみます。データ編成は他にもありそうな…。
NECの場合だと、相対編成、乱編成、待機結合編成なんて
のもありますね。

> ファイル編成とデータセット編成は同じことだよな…。???
大体において同じ意味で使用しているケースが多いです。

私の会社ではまだメインフレーム現役です・・・。

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAM...続きを読む

QSQL LIKE演算子 抽出できない

VB6でAccess2003のテーブルから情報を抽出したいと思っています。
「東京都千代田区」、「東京都新宿区」と入力するとそれらに該当
するレコードが全て抽出されてきます。しかし「東京都」だけ入力して
「東京都」から始まるレコードを全て抽出しようと「%」を使用して書換えました所、なにも抽出できなくなりました。
Set DB = OpenDatabase("c:\SalesManager\jdb.mdb")
strSQL = "SELECT * FROM t_USER "
strSQL = strSQL & "WHERE KOKYAKUMEI LIKE "
  strSQL = strSQL & "'" & "%" & txtUser.Text & "%" & "'"
初歩的な質問で申し訳ございませんが、ご教授頂きたく思います。
よろしくお願いします。
「%」を使用しなかった時のコード
strSQL = strSQL & "'" & txtUser.Text & "'"

Aベストアンサー

Access2003でLikeを使うとき % ではなく * で任意指定かな。
東京都% ⇒ 東京都* としてみてください。

Q複数条件の抽出SQL文がわかりません

WinXP DB:ACCESS2000
利用しています。

DB勉強中です、よろしくお願いします。

顧客管理の抽出条件のSQL文がわかりません。
T_顧客
ID 住所   氏名   TEL   紹介者1 紹介者2 紹介者3 紹介者4
001 愛知県名古屋市○1-1 山田太郎 000-000-0001  1  2  3
002 岐阜県岐阜市000-00  近藤たろう 000-110-0001  2 
003 愛知県愛知郡22-2222 後藤たろう 000-111-0001  3  4

T_紹介者
ID 住所   氏名   TEL
1 名古屋市 山田二郎 111-111-1112
2 岐阜市  安藤三郎 222-222-2222
3 津市   伊藤司郎 333-333-3333
4 静岡市  田中五郎 444-555-4445

と言うDBがありまして、以下のように抽出したいと思っています。

001 愛知県名古屋市○1-1 山田太郎 000-000-0001  山田二郎 安藤三郎 伊藤司郎
002 岐阜県岐阜市000-00  近藤たろう 000-110-0001  安藤三郎 
003 愛知県愛知郡22-2222 後藤たろう 000-111-0001  伊藤司郎 田中五郎

と言ったようにしたいです。

よろしくお願いします。

WinXP DB:ACCESS2000
利用しています。

DB勉強中です、よろしくお願いします。

顧客管理の抽出条件のSQL文がわかりません。
T_顧客
ID 住所   氏名   TEL   紹介者1 紹介者2 紹介者3 紹介者4
001 愛知県名古屋市○1-1 山田太郎 000-000-0001  1  2  3
002 岐阜県岐阜市000-00  近藤たろう 000-110-0001  2 
003 愛知県愛知郡22-2222 後藤たろう 000-111-0001  3  4

T_紹介者
ID 住所   氏名   TEL
1 名古屋市 山田二郎 111-111...続きを読む

Aベストアンサー

クエリの作り方でいいですか

以下に手順)

・クエリをデザインで作成します

・テーブル「T_顧客」を1つ、テーブル「T_紹介者」を5つ表示させます。
テーブル「T_紹介者」を5つ表示させると、テーブル名のところが、
「T_紹介者」、「T_紹介者_1」~「T_紹介者_4」になっていると思うので、
「T_紹介者」を表示上から削除します。
「T_顧客」、「T_紹介者_1」~「T_紹介者_4」の5つが表示されているようにします。

・「T_顧客」の「紹介者1」を「T_紹介者_1」の「ID」にドラッグします。
結合線が表示されるので、線をダブルクリックします。
結合プロパティは、'T_顧客'の全レコードと・・・・ に変更しOKボタン
紹介者2~4も同様に、
「紹介者2」を「T_紹介者_2」の「ID」に
「紹介者3」を「T_紹介者_3」の「ID」に
「紹介者4」を「T_紹介者_4」の「ID」に
結合プロパティは、'T_顧客'の全レコードと・・・・ に全て変更しOKボタン

・以下の順番にテーブル内の項目をダブルクリックしていきます。
「T_顧客」の「ID」「住所」「氏名」「TEL」
「T_紹介者_1」の「氏名」
「T_紹介者_2」の「氏名」
「T_紹介者_3」の「氏名」
「T_紹介者_4」の「氏名」

・下に表示されている一覧部分のフィールド欄のところの「氏名」が重複しているので、
テーブルが「T_紹介者_1」の「氏名」を「紹介者1: 氏名」に変更します。同様に
テーブルが「T_紹介者_2」の「氏名」を「紹介者2: 氏名」に
テーブルが「T_紹介者_3」の「氏名」を「紹介者3: 氏名」に
テーブルが「T_紹介者_4」の「氏名」を「紹介者4: 氏名」に


このクエリの表示を、データシートビューに切り替えてみます。

良かったら保存します。

クエリの作り方でいいですか

以下に手順)

・クエリをデザインで作成します

・テーブル「T_顧客」を1つ、テーブル「T_紹介者」を5つ表示させます。
テーブル「T_紹介者」を5つ表示させると、テーブル名のところが、
「T_紹介者」、「T_紹介者_1」~「T_紹介者_4」になっていると思うので、
「T_紹介者」を表示上から削除します。
「T_顧客」、「T_紹介者_1」~「T_紹介者_4」の5つが表示されているようにします。

・「T_顧客」の「紹介者1」を「T_紹介者_1」の「ID」にドラッグします。
結...続きを読む

Qデーターベースのエクセル抽出、検索で不一致(アンマッチ)抽出の方法を教えてください

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=b1586204-ddae-43d0-a193-2e82434823c1&viewtype=detail

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=69267f43-df55-40d0-8f71-5a8ba178e76b&viewtype=detail

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=5fe8bec5-c81a-4e6d-8bb3-48be8758c919&viewtype=detail

画像のような手順で通常は抽出しています
画像では 愛知県 名古屋市千種区 青柳町 で抽出作業をしています

必ず不一致(アンマッチ)が出ますが、このような抽出作業で不一致(アンマッチ)の抽出方法を教えてください

おねがいします

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=b1586204-ddae-43d0-a193-2e82434823c1&viewtype=detail

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=69267f43-df55-40d0-8f71-5a8ba178e76b&viewtype=detail

https://box.yahoo.co.jp/guest/viewer?sid=box-l-6ttgdaiicjxantthpenxc5gwqi-1001&uniqid=5fe8bec5-c81a-4e6d-8bb3-48be8758c919&viewtype=detail

画像のような手順で通常は抽出しています
画像では ...続きを読む

Aベストアンサー

ただたんにオートフィルターではいけないのですか?

オートフィルターをかけた状態で
①「都道府県名」で「愛知県」以外のチェックを外す。
├─「(全てを選択)」クリックして全てのチェックを外す。
└─「愛知県」クリックしてチェックを入れる。
②「市区町村名」で「名古屋市千種区」以外のチェックを外す。
├─「(全てを選択)」クリックして全てのチェックを外す。
└─「名古屋市千種区」クリックしてチェックを入れる。
③「大字・町名」で「青柳町」以外のチェックを外す。
├─「(全てを選択)」クリックして全てのチェックを外す。
└─「青柳町」クリックしてチェックを入れる。
④「字・丁目名」で「(空白)」以外のチェックを外す。
├─「(全てを選択)」クリックして全てのチェックを外す。
└─「(空白)」クリックしてチェックを入れる。
これならば入力する手間もかからないですし、漢字の打ち間違いとかもないと思うのですが…

QACCESS2000,桐,ファイルメーカーでカスタマバーコード印刷について

ACCESS2000でカスタマバーコードを印字したいのですが、関数の使い方で困っております。
例)郵便番号 123-4567
  東京都千代田区8-9東京マンションA-1号
を123456789A1 と抜き出したいのです。
桐,ファイルメーカーの関数でも構いません。
最終的に ACCESS2000で印刷を行いますのでCSV出力ができれば良いのです。

Aベストアンサー

> 文字列の長さだけ繰りかえすとのことですが、色々考えてみましたがどうも関数が作成できずマクロになってしまいます。何とか関
> 数で処理したいのでよろしければ
> 参考例をおしえていただければ大変有り難いのですが。

関数だけでやるなら、事前に最大何バイトになるか調べておいて
ひたすら繰り返すしかないんじゃないでしょうか?
=midb(a1,1,1)&midb(a1,2,1)&midb(a1,3,1)&midb(a1,4,1)&…

だから、「マクロでループさせる方が美しい」んですね。


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

人気Q&Aランキング

おすすめ情報