結果テーブルに グループ名、地方、人数、成績の4フィールドがあり、成績フィールド降順で並んでいます。(昇順に変更しておくことも可能です)
上記で、グループ名を指定して、成績トップの(地方、人数、成績)を抜き出すSQL文を教えて下さい。(同点がある場合は、結果テーブルで先にあるほう一つのみ取得する)
例、グループ名が、A又は、Bのうち、成績トップのレコードの3フィールド(地方、人数、成績)を取得。但しトップが複数ある場合は、結果テーブルで上位にあるほう一つのみ取得する
グループ名指定の繰り返しが多いため(VBAで繰り返しグループ指定)、速度ができるだけ早いSQL文をお願い致します。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
<ADO サンプル>
ID グループ名 地方 人数 成績
1 A A1 10 70.999
2 A A2 11 70.998
3 A A3 12 65.997
4 B B1 13 80.996
5 B B2 14 80.995
成績が、成績+レコード逆順とします。
[イミディエイトウインドウ]にグループ別のトップの成績を表示するのコードは次のようです。
A 70.999
B 80.996
Private Sub コマンド0_Click()
Dim I As Integer
Dim N As Integer
Dim strTopDatas(100, 1) As String
N = DBSelect(strTopDatas(), "[グループ名], Max(成績)", "Table1", "[グループ名]")
For I = 0 To N
Debug.Print strTopDatas(I, 0), strTopDatas(I, 1)
Next I
End Sub
[イミディエイトウインドウ]
A A1 10 70.999
B B1 13 80.996
このように、[イミディエイトウインドウ]に目的のデータを次のように表示するコードを示しておきます。
Private Sub コマンド0_Click()
Dim I As Integer
Dim J As Integer
Dim N As Integer
Dim M As Integer
Dim strTopDatas(100, 1) As String
Dim strTopMeisai(0, 3) As String
Dim strWhere As String
N = DBSelect(strTopDatas(), "[グループ名], Max(成績)", "Table1", "[グループ名]")
For I = 0 To N
strWhere = "[グループ名]='" & strTopDatas(I, 0) & "' AND 成績=" & strTopDatas(I, 1)
M = DBSelect(strTopMeisai(), "[グループ名], 地方, 人数, 成績", "Table1", , strWhere)
For J = 0 To M
Debug.Print strTopMeisai(0, 0), strTopMeisai(0, 1), strTopMeisai(0, 2)
Next J
Next I
End Sub
まあ、色々と複雑な SQL 文を考えなくても、VBAで書くのであればデータの抽出は簡単です。
※成績の整数化は、CInt()で行います。
※ここで、利用しているDBSelect関数を利用しています。
※必要であれば公開します。
No.1
- 回答日時:
<簡単に作る方法>
クエリのウィザードで、
1、グループの成績トップを取得する<グループ別成績トップ クエリ>を作る。
2、新たに、結果テーブルとグループ別成績トップ クエリから抽出するクエリを作成する。
これですと、ウィザード任せで簡単に作成することが可能です。
なお、結果テーブルの成績を 70.0001, 70.0002 と成績+レコードカウンタで作製しておくと上位の抽出は容易です。
Count(*)と成績を合成する手もありそうですが、シンプルなのが一番です。
ID グループ名 地方 人数 成績
1 A A1 10 70.0001
2 A A2 11 70.0002
3 A A3 12 65.0003
4 B B1 13 80.0004
5 B B2 14 80.0005
SELECT DISTINCTROW テーブル1.グループ名, Max(テーブル1.成績) AS 成績の最大
FROM テーブル1
GROUP BY テーブル1.グループ名;
SELECT テーブル1.グループ名, テーブル1.地方, テーブル1.人数, テーブル1.グループ名, テーブル1.成績
FROM テーブル1, [テーブル1 クエリ]
WHERE (((テーブル1.グループ名)=[テーブル1 クエリ]!グループ名) And ((テーブル1.成績)=[テーブル1 クエリ]!成績の最大));
<高速に処理したい場合>
DAO の SEEK を用いて検索する。
遅いので評判の Jetエンジンではなく SEEK という最も低レベルの検索を行わせればかなり高速化すると思います。
*お勧めは、複雑なクエリを利用しないで、単純で判りやすく ADO で書くことです。
*クエリウィザードで作成したクエリを VBA のコードに移植するだけですので難しいことではありません。
※ ADO サンプルは長くなるので別回答とします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
ACCESSに同時アクセス(編集)を...
-
access テーブル内のレコード...
-
Accessの追加クエリで既存のテ...
-
Accessレコードの追加や変更が...
-
デザインビューで、連結式 を...
-
ACCESS97のテーブルサイズについて
-
リンクテーブルを CopyObject ...
-
Accessでvlookupみたいなことは...
-
ACCESSで指定されたテーブルか...
-
SQLで日付を条件に削除したい
-
3つの表を1つに縦に連結する
-
Accessでテーブルからテーブル...
-
テーブル作成クエリで主キーを設定
-
Accessクエリでの、LIKE条件
-
Accessでテーブルをデータシー...
-
アクセスで消し込みがしたい
-
テーブルの値の先頭2桁を全て...
-
翌営業日までの日数をSQLで求め...
-
ツリー構造をRDBで表現するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
ACCESSに同時アクセス(編集)を...
-
Accessクエリでの、LIKE条件
-
Accessでテーブルからテーブル...
-
access テーブル内のレコード...
-
デザインビューで、連結式 を...
-
2つのテーブルを比較して一致し...
-
3つの表を1つに縦に連結する
-
ACCESSで指定されたテーブルか...
-
Accessレコードの追加や変更が...
-
Accessの追加クエリで既存のテ...
-
Accessでvlookupみたいなことは...
-
SQLで条件指定結合をしたいがNU...
-
ツリー構造をRDBで表現するには?
-
SQLで日付を条件に削除したい
-
リンクテーブルを CopyObject ...
-
Accessのサブフォームで#Name...
-
時間の足し算
-
INSERT時にデータ登録とmaxの発...
-
SQL: SELECT UNIONすると文字数...
おすすめ情報