[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.088 Access クエリー DCount関数で順位付け

Access クエリー DCount関数で順位付け

メルマガ発行内容

<Access クエリー DCount関数で順位付け>

どうも、三流プログラマーのKen3です。 今回は、 Accessのクエリー演算フィールドで、 DCount関数を使って順位を付けて遊んでみたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba088.lzh にdb088.mdb(Access2000版)が保存されています。 *Access97のマシーン熱暴走気味で不安定なので、 Access2000になってます。

/* * 1.今回のキッカケ */

メールでもらった下記の質問、 --------------- In message "アクセスVBAでwindowの閉じ方、グループでのデータ取得法...", >あとひとつは、やはりアクセスで、 >グループ処理のとき、次のデータから > >    fld1 fld2 fld3 >     あ  2   a >     あ  1   b >     あ  4   c > >「あ」でグループ化し、fld2から 最小値 1をえらび > fld3 については、bを表示させたいのですが、 >(fld2に属するfldsのデータを選ぶ) > >どうすればよろしいのですか。 --------------- そんな質問に対して、 No.87 Access DLookup関数を使ってみた http://www.ken3.org/backno/backno_vba18.html#87 で、クエリーとDLookup関数を使って、処理してみました。 今回は、DCount関数を使って、少しイタズラしてみたいと思います。

/* * 2.クエリーでレコードに順位を付ける */

No.85 Access クエリーで演算フィールドを使ってみる http://www.ken3.org/backno/backno_vba18.html#85 で、 クエリーでIIfとDateAdd関数などの関数を使用することができ、 これを演算フィールドと解説してました。 いろいろとWebを演算フィールドをキーワードに散歩していると クエリーの演算フィールドに 順位: DCount("fld2","TEST_TABLE","fld2 >" & [fld2])+1 と 順位を付けるサンプルが転がっていた。 元データ ^^^^^^^^ ID fld1 fld2 fld3 1 あ 2 a 2 あ 1 b 3 あ 4 c 4 い 5 a 5 い 6 b 6 い 4 c 7 い 10 d に対して、さっそく使ってみると、 順位: DCount("fld2","TEST_TABLE","fld2 >" & [fld2])+1 をクエリーの項目として指定。 fld1 fld2 fld3 順位 あ 2 a 6 あ 1 b 7 あ 4 c 4 い 5 a 3 い 6 b 2 い 4 c 4 い 10 d 1 ははは、これだとたんにfld2の大きさで順位付けてるなぁ。 それに大きい順ジャン まぁ、速度は別にして面白い方法だよね。 Dcountで自分より大きい該当レコードがいくつあるか? を "fld2 >" & [fld2] を条件にして検索。 で+1がポイントで、一番大きい値の時、 DCount("fld2","TEST_TABLE","fld2 >" & [fld2]) は0を返すから+1して1位〜はじめてるのね。 DCount("項目","テーブルorクエリ","条件") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ これをうまく使っているよね。 []で項目を囲って、クエリー内で使っているのがポイントなぁ。

/* * 3.グループ別に順位を付ける */

順位付け、まぁなんとなくわかったけど、 何やりたいの?アナタは? あっ、グループ別小さい順に順位をふって、頭の1位のデータだけ取りたくて そうなんだぁ、大変だねぇ。 まずは、逆順(小さい順)、自分以下の値のデータが在るかカウントするか。 あっ、符号を逆にしてみるか。 順位: DCount("fld2","TEST_TABLE","fld2 <" & [fld2])+1 fld1 fld2 fld3 順位 あ 2 a 2 あ 1 b 1 あ 4 c 3 い 5 a 5 い 6 b 6 い 4 c 3 い 10 d 7 ここまでの小細工で、fldの小さい順に順位がふれたけど、 これでは意味無いんだよねまだ。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ えっ、なんで? fld1='あ'別、fld1='い'別に順位を振りたいんだよねグループ別にAnd条件で。 アンタなに?言ってんの?And条件とか自分で言ってるジャン。 そのまま素直に書いたら?いつもヒネクレテるから素直なソース書けないの? 順位: DCount("fld2","TEST_TABLE","fld1 = '" & [fld1] & "' And fld2 <" & [fld2]) fld1 fld2 fld3 順位 あ 2 a 1 あ 1 b 0 あ 4 c 2 い 5 a 1 い 6 b 2 い 4 c 0 い 10 d 3 ※+1今回からは止めました(0からの順位にしました) あらら、素直に条件に、 fld1(が)= '" & [fld1] & "'" フィールド1が同じで And fld2(が) <" & [fld2]) フィールド2が自分より小さい そんなレコードを数えて順位としてみました。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 4.先頭レコードに絞りたいので、順位=0にしてみた。 */

で、レコードの折りたたみじゃないけど、 順位が0の先頭レコードだけ取り出したいので、 クエリーの条件に0を入れてみます。 fld1 fld2 fld3 順位 あ 1 b 0 い 4 c 0 と、先頭を取り出すことが出来ました。 ↑抽出条件に順位0を指定 SQLビュー、、長い SELECT TEST_TABLE.fld1, TEST_TABLE.fld2, TEST_TABLE.fld3, DCount("fld2","TEST_TABLE","fld1 = '" & [fld1] & "' And fld2 <" & [fld2]) AS 順位 FROM TEST_TABLE WHERE (((DCount("fld2","TEST_TABLE","fld1 = '" & [fld1] & "' And fld2 <" & [fld2]))=0)); これでQ_CHKって、 グループ別のfld2が一番小さなレコードを取り出す クエリーが無事に出来ました。 ※順位付けしなくても、グループ化のクエリー集計でできるかもしれませんが。 あとは、このQ_CHKクエリーをつなげて遊んでみるかな。 会員情報 ID 入会日 更新日 point 住所 氏名 電話番号 記号 1 2003/04/01 120 名古屋 ドラキチ あ 2 2002/03/01 2003/03/01 15 北海道 どさんこ い 3 2003/05/01 0 う なんて、明細データの記号項目とQ_CHKをつなげて、Q_CHKのfld3を取り出してみます。 会員情報の記号とQ_CHKのfld1をまずつなげます。 その後結合プロパティを会員情報全てに変更します。 あっ、マスターが見つからない時(テストでは""の時)を考慮して ↑結合プロパティの設定サンプル、右押してプロパティ変えただけ あとは、ほしいデータをセレクトします。 ↑fld3をQ_CHKから選択してみました。 ID 入会日 住所 氏名 記号 fld3 1 2003/04/01 名古屋 ドラキチ あ b 2 2002/03/01 北海道 どさんこ い c 3 2003/05/01 う と、無事にデータが取れました。 1つ順位付けのクエリーを使用したけど(逃げたけど)、 1つのSQLで福問い合わせで書くと、なんか長くなりそうですね。 あとは、順位付けて細工したマスターデータ、量が多いと、 Q_CHKクエリーの中でDcountしているので、速度の注意が必要かなぁ。 もし繰り返し使うなら、一時テーブルに書き出す(テーブル作成orデータ削除・追加)、 集計や印刷作業 終了後一時テーブルを消す、 なんて方が、速度的には速いし、安心できるかも。

/* * 5.終わりの挨拶 */

サンプルファイルは、 http://www.ken3.org/vba/lzh/vba088.lzh にdb088.mdb(Access2000版)が保存されています。 *Access97のマシーン熱暴走気味で不安定なので、 Access2000になってます。 今回は、クエリーでDcount関数を使用した、 順位付けのお話、ついでにグループ別の順位付けの話。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]