• ベストアンサー

Access 各レコードの中での最大フィールドを抽出したい

Accessにつぎのようなテーブルがあります(例)。 各人の成績表 フィールド1:名前 フィールド2:1回目の得点 フィールド3:2回目の得点 フィールド4:3回目の得点 名前の重複はありません。 レコードごとに、フィールド2~4の最大値を抽出する方法を教えていただけると、たいへん幸せです。 どうぞ、よろしくお願いします。

noname#10474
noname#10474

質問者が選んだベストアンサー

  • ベストアンサー
  • snoopy64
  • ベストアンサー率42% (337/793)
回答No.3

モジュールを作成し、その中に関数を作成します。 Function myMax(ParamArray a()) Dim i myMax = -9999 For i = 0 To UBound(a()) If a(i) > myMax Then myMax = a(i) Next End Function で、クエリに 最高点: myMax([n01],[n02],[n03]) というふうに関数を使えます。SQLでは SELECT t8.name, t8.n01, t8.n02, t8.n03, myMax([n01],[n02],[n03]) AS 最高点 FROM t8; となります。 頑張ってくださいヽ(^。^)ノ

noname#10474
質問者

お礼

回答くださり、ありがとうございます。 がんばってみました! ・・・と言っても、まったく意味も分からず、snoopy64さんの書き込みをただコピー&ペーストしただけなんですが。 大成功でした。どうもありがとうございます。助かりました!

その他の回答 (2)

回答No.2

選択クエリのフィールド名に 最大値:IIf([1回目の得点]>=[2回目の得点],IIf([1回目の得点]>[3回目の得点],[1回目の得点],[3回目の得点]),IIf([2回目の得点]>=[3回目の得点],[2回目の得点],[3回目の得点])) で可能です。 また、#1の方もおっしゃっていますが、得点のフィールドが今後も増えていくことが予想されるなら、テーブルの設計を見直したほうが良いかもしれません。 そうしないと、フィールドが増えるたびにクエリを作り直さないといけなくなりますから。 ただ、個人の得点は絶対に3回までというのであればこのままでも問題ないとは思います。

noname#10474
質問者

お礼

回答くださり、ありがとうございました。 いままで、IIfという関数は使ったことがなかったので、勉強になります。 レコードは大量に増えるのですが、フィールドは増えていかないので、一度設定すれば大丈夫そう! 別の目的でテーブル設計されたものを利用しようとするのは、ほんと私の知識では手に負えません。どうもありがとうございました。

noname#7749
noname#7749
回答No.1

UNIONクエリを使用すれば可能です (下記を参照) SELECT qry01.名前, Max(qry01.得点) AS 得点の最大 FROM [SELECT 各人の成績表.名前, 各人の成績表.1回目の得点 AS 得点 FROM 各人の成績表 UNION SELECT 各人の成績表.名前, 各人の成績表.2回目の得点 AS 得点 FROM 各人の成績表 UNION SELECT 各人の成績表.名前, 各人の成績表.3回目の得点 AS 得点 FROM 各人の成績表 UNION SELECT 各人の成績表.名前, 各人の成績表.4回目の得点 AS 得点 FROM 各人の成績表 UNION SELECT 各人の成績表.名前, 各人の成績表.5回目の得点 AS 得点 FROM 各人の成績表 ORDER BY 名前, 得点]. AS qry01 GROUP BY qry01.名前 ORDER BY qry01.名前 しかし、現状のテーブルは話にならないほどひどい設計と言えます。 SQLが複雑化するのも偏に設計が悪いからです。 具体的にどうするか、ですが、下記の解説を一読されるとよいでしょう。 [テーブルの正規化] www8.pekori.to/~zoma/kanki_t.html

参考URL:
www8.pekori.to/~zoma/kanki_t.html
noname#10474
質問者

お礼

さっそくにお手数おかけしました。 回答ありがとうございます。 設計につきましては、現実にはもっとたくさんのフィールドがあり、毎月毎月レコードが万単位で作製されているデーターベースのため、本当に必要な部分だけ、例としてだしました。申し訳ございません。 テーブルの設計の見直しは、本筋の業務から無理なのです。ごめんなさい。アドバイスありがとうございました。

関連するQ&A

  • ACCESS2000でのレコード抽出

    OS:WindowsXP ACCESS2000 あるフィールドの値が最大となるようなレコードを選択クエリで 抽出しようとしているのですがうまくいきません。 テーブルのフィールドは4個あります。 テーブル [系列] [優先度] [データ1] [データ2] ここで各系列ごとに優先度が最大となるレコードのみを 抽出したいのです。 系列、データ1、データ2は重複がありえます。 優先度は系列を跨いだ重複はありますが、 同系列内での重複はありません。 レコードの例) 1:系列A 優先度1 データA データB 2:系列A 優先度2 データC データD 3:系列B 優先度1 データE データF 上記の例で言いますと、レコード2:とレコード3:のみを 抽出するクエリを作成したいのです。 集計クエリで優先度のフィールドを「最大」にしても、 3つのデータ全てが抽出されてしまいます。 どなたか解決策をご教示ください。

  • SQL最大値レコード抽出について

    下記のようなテーブルがあったとしてフィールド1のコードごとにフィールド2が最大値のものを抽出したいのですが一回のSQLで可能ですか? フィールド1 フィールド2 abc 20070309 abc 20070302 abc 20070307 def 20070304 def 20070306 def 20070303 ・ ・ ・ 例: abc 20070309 def 20070306 ・ ・

    • ベストアンサー
    • MySQL
  • あるフィールドの最大値を条件にデータを抽出する方法

    Access97のVBAで開発を行っています。SQLでデータの抽出で、あるフィールドの最大値を条件に指定して抽出する方法を教えてください。最大値という曖昧な条件なため、悩んでいます。 (例)ある学校の成績テーブル(左から、学籍番号,組,氏名,性別,科目,点数) 0103,鈴木,男,国語,95 0103,鈴木,男,数学,40 0103,鈴木,男,英語,80 0104,高橋,男,国語,45 0104,高橋,男,数学,85 0104,高橋,男,英語,55 | |(SQLで各人の最高点のデータのみ抽出したい) ↓ (抽出結果) 0103,鈴木,男,国語,95 0104,高橋,男,数学,85 知っている方、是非教えてください。 お願いします。

  • キーのフィールドが最大値の他フィールドのデータ抽出

    下記のようなテーブルがあったとします。 ----------------------  (1) | (2) | (3)  ----------------------  A | 3 | あ  A | 1 | い  A | 5 | う  B | 3 | え  B | 2 | お ---------------------- フィールド(1)がグループで、それぞれAグループ、 Bグループとします。 このとき、それぞれのグループ内のフィールド(2)が 最大のレコードのフィールド(3)データを抽出したいのですが、 どのようにすればよいでしょうか? 上記の例で言うと、 ----------------------  (1) | (2) | (3)  ----------------------  A | 5 | う  B | 3 | え ---------------------- という結果を得たいのですが・・・

  • Access VBA 抽出したレコードをフィールドを増やして別テーブルに追加する方法

    2つのクエリーで抽出したレコードを結合し、そのレコードにID番号をつけて別のテーブルに追加することはできないでしょうか? 1枚のガラスの値段表を作りたいと考えています。 使用するテーブルは、1つ目がサイズ表でサイズ番号と2つの辺の長さの3つのフィールドからできています。2つ目はガラスの種類表で種類番号と種類名の2つのフィールドでできています。3つ目は値段表で上の2つの表の5つのフィールドにID番号と値段の2つのフィールドがあり全部で7つのフィールドです。 いま、フォームにサイズ表と種類表のサブフォームをつくり、それぞれ結合したいレコードを表示させています。そこからフォームに値段を入力し登録ボタンをクリックすると値段表に新しいレコードを追加するような登録ボタンを作りたいです。 簡単な例でも構いません。 VBAがわかる方、教えてください。

  • 最大値を含むレコードの抽出

    お世話になります。 SQLでIN句やサブクエリではなく、HAVING句+MAX関数を使用して最大値を含むレコードを抽出することはできるのでしょうか。 id | name | value --------------- 1 | aaaa | 2000 2 | aaaa | 1000 3 | bbbb | 1000 上の表でいうとnameフィールドでグルーピングしてidの1と3が抽出対象になります。MySQLを使用しておりますが、 標準SQLでお願いしたいです。 よろしくどうぞ。

    • ベストアンサー
    • MySQL
  • Accessでの抽出について

    Accessで下記のようなテーブルがあるとします。 フィールド1  フィールド2  フィールド3 ----------------------- Aさん      20       200 Aさん      10       180 Bさん      10       300 Cさん      10       250 Cさん      30       310 条件1・・・フィールド2が「20」 条件2・・・フィールド3が「200」 この条件が当てはまる、フィールド1のデータはすべて抽出というふうにしたいのですが・・・。 (上記のテーブルでは、1件目と2件目のレコードがあてはまります。) どのようにして抽出したらよいでしょうか?よろしくお願いします。 Access2000を使用します。

  • 重複レコードについて

    重複レコードについて ACCESS2002での話になります。 テーブルに下記レコードが複数存在します。 (例) フィールド1 フィールド2 フィールド3 愛知 田中 12 愛知 田中 11 愛知 田中 13 三重 山本 23 三重 山本 21 岐阜 鈴木 33 岐阜 鈴木 34 上記を下記の形で抽出したいと考えております。 フィールド1 フィールド2 フィールド3 愛知 田中 12 三重 山本 23 岐阜 鈴木 33 条件はフィールド1で重複がなくなるように抽出したいです。 フィールド3はどの値を抽出してもかまいません。 DESTINCTでの抽出を考えたのですが、それだと全てのカラムに DESTINCTがかかって希望の抽出が出来ませんでした。 何卒ご教授お願いいたします。

  • AccessのクエリでvbLfのみ抽出するには

    Access2010のクエリー(SQL)で vbLfかvbCrLfが含まれているレコードを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(10) & "*"; vbLfが含まれているレコードは抽出せず、 vbCrLfが含まれているレコードだけを抽出するには、 SELECT [テーブル1].* FROM テーブル1 WHERE [テーブル1].フィールド1 Like "*" & Chr(13) & Chr(10) & "*"; でよいと思いますが、 vbCrLfが含まれているレコードは抽出せず、 vbLfが含まれているレコードだけを抽出するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。

  • 「主キー以外重複データ(フィールド多数)」の抽出

    タイトルのような抽出方法が必要になり、その出し方で困っています フィールドが100以上ある大きなテーブルが複数(フィールド構造は全く同じ)あり、 そのレコードを一つにまとめる為重複データを抽出し削除したいのです 条件は「主キー以外の全てのフィールドのデータが一致してる重複データ」であり、 それをどうやればAccessの機能で出せるのか悩んでいます。 最初はクエリでグループ化して出そうと思ったのですがこのフィールド数では全て グループ化はできず、 VBAで一行ずつループで処理しようにもキー以外の全フィールド一致とする検索条件のSQLのWHERE式が複雑すぎると出て処理できませんでした フィールド数が多大なテーブルで主キー以外完全一致の重複レコードをうまく抽出するにはどうすればいいのでしょうか?

専門家に質問してみよう