- ベストアンサー
Access 各レコードの中での最大フィールドを抽出したい
Accessにつぎのようなテーブルがあります(例)。 各人の成績表 フィールド1:名前 フィールド2:1回目の得点 フィールド3:2回目の得点 フィールド4:3回目の得点 名前の重複はありません。 レコードごとに、フィールド2~4の最大値を抽出する方法を教えていただけると、たいへん幸せです。 どうぞ、よろしくお願いします。
- みんなの回答 (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; となります。 頑張ってくださいヽ(^。^)ノ
その他の回答 (2)
- gon_hunter
- ベストアンサー率33% (29/87)
選択クエリのフィールド名に 最大値:IIf([1回目の得点]>=[2回目の得点],IIf([1回目の得点]>[3回目の得点],[1回目の得点],[3回目の得点]),IIf([2回目の得点]>=[3回目の得点],[2回目の得点],[3回目の得点])) で可能です。 また、#1の方もおっしゃっていますが、得点のフィールドが今後も増えていくことが予想されるなら、テーブルの設計を見直したほうが良いかもしれません。 そうしないと、フィールドが増えるたびにクエリを作り直さないといけなくなりますから。 ただ、個人の得点は絶対に3回までというのであればこのままでも問題ないとは思います。
お礼
回答くださり、ありがとうございました。 いままで、IIfという関数は使ったことがなかったので、勉強になります。 レコードは大量に増えるのですが、フィールドは増えていかないので、一度設定すれば大丈夫そう! 別の目的でテーブル設計されたものを利用しようとするのは、ほんと私の知識では手に負えません。どうもありがとうございました。
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
お礼
さっそくにお手数おかけしました。 回答ありがとうございます。 設計につきましては、現実にはもっとたくさんのフィールドがあり、毎月毎月レコードが万単位で作製されているデーターベースのため、本当に必要な部分だけ、例としてだしました。申し訳ございません。 テーブルの設計の見直しは、本筋の業務から無理なのです。ごめんなさい。アドバイスありがとうございました。
お礼
回答くださり、ありがとうございます。 がんばってみました! ・・・と言っても、まったく意味も分からず、snoopy64さんの書き込みをただコピー&ペーストしただけなんですが。 大成功でした。どうもありがとうございます。助かりました!