dポイントプレゼントキャンペーン実施中!

結果テーブルに グループ名、地方、人数、成績の4フィールドがあり、成績フィールド降順で並んでいます。(昇順に変更しておくことも可能です)

上記で、グループ名を指定して、成績トップの(地方、人数、成績)を抜き出すSQL文を教えて下さい。(同点がある場合は、結果テーブルで先にあるほう一つのみ取得する)

例、グループ名が、A又は、Bのうち、成績トップのレコードの3フィールド(地方、人数、成績)を取得。但しトップが複数ある場合は、結果テーブルで上位にあるほう一つのみ取得する

グループ名指定の繰り返しが多いため(VBAで繰り返しグループ指定)、速度ができるだけ早いSQL文をお願い致します。

よろしくお願いします。

A 回答 (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関数を利用しています。
※必要であれば公開します。
    • good
    • 0

何だかプロシージャの制作依頼に聞こえるのは、私だけでしょうか...

    • good
    • 0

<簡単に作る方法>



クエリのウィザードで、

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 サンプルは長くなるので別回答とします。
    • good
    • 0

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

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