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と関連する良く見られている質問

Qエクセルで特定のマイナス値を除く最大値と最小値について

エクセルで、ある特定の値(-99999)を除く最大値と最小値を

=MAX(IF(A1:A10<>-99999,A1:A10,""))
=MIN(IF(A1:A10<>-99999,A1:A10,""))

の配列数式を使って求めました。

ただ、A1:A10がすべて-99999の場合、0がかえってきてしまいます。
この場合、-99999と表示するにはどのようにすればよいのでしょうか?

1つの式で、上記2つの処理をするにはどのようにすればよいのでしょうか?

Aベストアンサー

修行中の身なので『指導』は勘弁してください。:D

>最大値は-99999以外の値がすべてマイナス値の場合に0がかえってきてしまいます。
提示の式
>=MAX(IF(A1:A10<>-99999,A1:A10,""))
これでも同じですよね?
なので空白セルはないと判断しました。

あるなら、ベタですが
=IF(AND(A1:A10=-99999),-99999,MAX(IF(A1:A10<>-99999,IF(A1:A10<>"",A1:A10,""))))
の配列数式で。

#他の方の案もお待ちになられたほうが良いかもしれません。

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...続きを読む

Q(EXCEL)最大値、最小値を除いた平均

たとえばA1、A2・・A4、A5にある測定値が入っています。
この中で最大値と最小値を除いた平均値をA6に入れたいのですが、どのような式を入れたらよろしいでしょうか?

よろしくお願い致します。

Aベストアンサー

こんな式でどうでしょうか。
ちょっと長いですが。

=(SUM(A1:A5)-MAX(A1:A5)-MIN(A1:A5))/(COUNT(A1:A5)-2)

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を使うとき % ではなく * で任意指定かな。
東京都% ⇒ 東京都* としてみてください。

QExcel 2007にて最小値・最大値・平均値が計算されなくなってしまいました。

違う相談サイトにて質問させて頂きましたが、回答がなく急ぎ助けて頂きたくこちらにて質問させて頂きます。
Excel 2007使用です。E2~E25未入力セル(必要時入力)があり、折れ線グラフがうまくつながらなく「データ要素を線で結ぶ」にチェックしてもグラフの線が未入力部分も線でつながってしまう為、E2の式を「=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」と入力し(E25~E25までオートフィル)表示された「#N/A」は条件付き書式で非表示したのですが、それまでE26で最小値として「=MIN(E2:E25)」・E27で最大値として「=MAX(E2:E25)」・E28で平均値として「=IF(COUNT(E2:E25),AVERAGE(E2:E25),)」と入力して計算され表示されていたのですが、折れ線グラフをうまく表示する為にE2~E25の式を変更したらグラフはうまく表示されたのですが、最小値・最大値・平均値が計算されなくなってしまいました。どうしてもこの3種の計算も大事で、外す事も出来ず色々調べたのですがわからなく大変困っております。助けて下さい。当方まだ未熟なのでわかりやすく教えて下さい。よろしくお願いいたします。説明が下手でわかりにかった場合お詫び致します。

違う相談サイトにて質問させて頂きましたが、回答がなく急ぎ助けて頂きたくこちらにて質問させて頂きます。
Excel 2007使用です。E2~E25未入力セル(必要時入力)があり、折れ線グラフがうまくつながらなく「データ要素を線で結ぶ」にチェックしてもグラフの線が未入力部分も線でつながってしまう為、E2の式を「=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」と入力し(E25~E25までオートフィル)表示された「#N/A」は条件付き書式で非表示したのですが、それまでE26で最小値として「=MIN(E2:E25)」・E27で最大値とし...続きを読む

Aベストアンサー

こんにちは。

質問は、適当に改行を入れて読みやすくしてください。

=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」
NA()がはいると、計算されません。ですから、配列数式で、エラー値を除外してあげないといけません。

=MAX(IF(ISNA(E2:E25),"",E2:E25)

=MAX(IF(ISNA(E2:E25),"",E2:E25)

=SUM(IF(ISNA(E2:E25),"",E2:E25))/COUNT(E2:E25)

これらは、配列数式ですから、一旦式を入力したら、F2を押して、『ShiftとCtrlを押しながらEnterキー』を押して、再確定してください。

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等間隔ごとのセルの平均値、最大値、最小値を求める関数式

仕事で作業時間をエクセル表にまとめています。

A~Cに作業項番と作業内容、D,E,Fにそれぞれ作業時間の平均、最小、最大値が入っています。その次の列からそれぞれの作業時間が入っています。
ひとつの作業で4列分使い、左から作業開始時間、作業終了時間、所要時間、所要時間の小計と続いています。

今までは、平均、最小、最大をAVERAGE,MIN,MAX関数を使い、一つのセルずつ計算していました(例:=MIN(I9,M9,Q9,U9.Y9,AC9,・・・,)が、作業回数が30回を超えたところ、これらの方法が使えなくなってしまいました。(計算できる数値が30個までしかない)

30個以上の数値を計算させるためにはどうしたらよいのでしょうか。
また、式が長くなると管理が大変になってくるので、すっきりとまとめられるような関数があったら教えてください。

以上です。よろしくお願いします。

Aベストアンサー

配列数式を使います。
=MAX(IF(MOD((COLUMN($I$9:$AP$9)-9),4)=0,$I$9:$AP$9,""))
CtrlキーとShiftキーを押しながら、Enterキーを押します。
数式には、自動的に { }  がついて、
{=MAX(IF(MOD((COLUMN($I$9:$AP$9)-9),4)=0,$I$9:$AP$9,""))}
のようになります。

例:=MIN(I9,M9,Q9,U9.Y9,AC9,・・・
の場合、列番号が I が9番目、Mが13番目・・・と4つ置きになっていますので、
範囲のなかで、列番号から9を引いた数を4で割った余りが0のものを計算するという意味です。AVERAGE,MAX関数も同じです。

例の通りでなかったら、適切に変えてください。
等間隔でしたら、なんらかの規則性があると思います。

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ベストアンサー

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

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

Qc言語 正負の値それぞれでの最大値最小値

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される

0,0,0,0,0,0,0,0,0,0
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される


といったプログラムを作成したいです。教えてください!

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)...続きを読む

Aベストアンサー

本当に研究で使うデータ処理なのかなぁ?
こんな単純なデータ処理をして結果を表示するだけなんて研究に使うとは思えない。
むしろ課題を丸投げにしているように見える。

数値が縦一列に入っているということは各数値は改行で区切られているのだから、
ファイルをオープンして一行づつデータを読み取りながら、その数値の正負零を判定し、
(零を除いて)正負それぞれの最大最小を順次残していくようにすればよい。
最後に、残った最大最小の値を表示または非存在を表示する。
大した処理ではないと思われますが。。。

もしC言語が苦手だというのであれば、Excelなどの表計算ソフトのマクロで行っても
たいしたことは無いでしょう。

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ランキング