戻る HOME

Access での順位付け


 Excel には RANK 関数があるので順位を付けることは簡単ですが、Access には RANK 関数がないので成績処理などでの順位付けが簡単にはできません。Access のある解説書の中で、「いったん Excel にエクスポートして処理をさせたあとで、インポートすればできる」とか書いてあるのを見たことがありますが、あまり現実的な方法ではありませんね。(^_^;
 ただ並び替えて連番を振るだけでは同点の場合に同じ順位にならないので困ります。同じ点数の場合には、同じ順位でなければなりません。そのためには、クエリーで処理するか、VBA でユーザー関数を作って利用することになります。

 ここでは比較的簡単なクエリーを利用する方法を紹介します。なお、この方法は pPoy さんに教えていただきました。
 (pPoy さん、ありがとうございました。m(_ _)m )

 説明のために、テーブル名が[T_成績]というテーブルがあり、その中に
   フィールド名:[出席番号]
   フィールド名:[得点]
という2つのフィールドがあるとします。
 これを前提として以下の手順でクエリーを作ります。

  1. まず、新規にクエリーを作ります。これはただの選択クエリーで、[T_成績]テーブルを1個だけ追加します。
  2. クエリーグリッドのフィールド欄に[出席番号][得点]を追加します。
  3. 最後のフィールドに順位を求める式を入力します。式は以下の通りです。
      順位: (select count(*) from T_成績 as T_成績_1 where T_成績_1!得点>T_成績!得点)+1
  4. このクエリーを保存して実行してみてください。
 ただし、このままでは[得点]が null の場合(未受験など)に対応できません。[得点]の下の「抽出条件」に Is Not Null と書いて、受験者だけを抽出した上で順位付けをするなど、テーブルやシステムに合わせて工夫してください。

 順位を求める式の説明です。

 「count(*)」で where 句によって抽出されたレコード数を数えます。
 「as T_成績_1」としてあるのは、『集計関数を使うときは、必ずもとの名前と別の名前をつけないといけない』という掟があるからです。ここの式では、最初のテーブル名と区別する為に後ろに「 _1 」をつけました。

 まず、現位置のレコードの[得点]より高い[T_成績_1]テーブルの件数を抽出し、数えます。その数プラス1が、結果的に順位となります。同得点の場合、上位者の数は同一のため、同じ順位となります。プラス1は自分自身の件数を加えるために必要です。これを入れないと、得点の順位は0位から始まってしまいます。つまり、順位は「その生徒の得点より高得点の生徒の人数に1を足したもの」である、ということを利用するわけです。

----------

2002年6月3日 追記

 後日、読者の方から、「選択クエリーで実行すると、データが大量の場合、実行するたびに異なるレコード件数がかえってくる(減少する)。ただし、テーブル作成クエリーで実行してみると、正確なレコード件数がかえってくる」というご指摘をいただきました。
   どうやら、レコード件数が多いと、数え漏れが発生するようです。どれを置き忘れるかは、不明です。これは Access のバグかもしれません。回避策としては、表示された抽出結果を再度順位の昇順などにソートしてやると、今度は正確な件数が表示できると思います。これは Access が再度件数を当たり直すためだと思われます。しかし、ちょっと時間が掛かります... (^^ゞ

 いずれにしても、レコードが 1000 件を超える場合は、テーブル作成クエリを使用したほうが安全です。

 なお、この件に関しても pPoy さんにアドバイスしていただきました。m(_ _)m



戻る