- ベストアンサー
速度を意識した成績トップのデータ抽出方法
- SQL文を使用して、指定したグループ名の成績トップの(地方、人数、成績)データを抜き出す方法を教えてください。
- 質問文章のテーブルには、グループ名、地方、人数、成績の4つのフィールドがあり、成績フィールドは降順に並んでいます。
- グループ名が指定され、成績トップのデータを取得する際、同点がある場合は上位にあるデータのみを取得します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
<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関数を利用しています。 ※必要であれば公開します。
その他の回答 (2)
何だかプロシージャの制作依頼に聞こえるのは、私だけでしょうか...
<簡単に作る方法> クエリのウィザードで、 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 サンプルは長くなるので別回答とします。