<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>クエリを極める
  



 menu

50. 売上金額が「最大」の人の情報を出す

[社員テーブル]から、[売上]が最も多いネコの情報を1行分抽出します。
これは、一見「集計クエリ」を使えば簡単そうに見えますが、そうでもないんですよ。


■まちがいな例
[社員テーブル]の全フィールドを選び、集計クエリで集計方法を「最大」にして・・・・。

確かに1行分レコードが抽出されますが・・・。

集計クエリの「最大(最小も)」は、あくまで「その列(フィールド)の中の最大値(または最小値)」を取ります。
売上の多いレコードを表示しているわけではなく、「[番号]の最大」「[名前]の最大(あいうえお順に並べて一番下にくる値ってことですかね)」「[グループ]の最大」「[出身]の最大」「[生年月日]の最大」「[売上]の最大」が横に並んでいるだけで、これはひとりの人の情報ではありませんよね。
クエリとしては正しく機能しているのですが、果たしてこれは、私たちが知りたい情報でしょうか・・??

では、最大値を出すのは[売上]だけにして、あとのフィールドは集計しないようにして・・・。
というわけには、残念ながらいきません。よく考えればそうですよね。
集計クエリはあくまで集計するためのクエリなので、集計する必要のないフィールドを選んだら、そのフィールドも無理やり何かしら集計しようとしてしまいます。
これだと、選んでいるフィールドの中に[名前]や[番号]がありますので、このクエリは「名前ごとの[売上]の最大値」を出そうとします。選んだフィールドで自動的にグループ化しますからね。。。[名前]や[番号]を選んでいる以上、テーブル全体の[売上]の最大値を求めることはできないのです。

そこで、こういう場合は「[売上]の最大値の数値を、[売上]の抽出条件にする」という具合に考えます。



■正しい例<サブクエリを使う
やり方としては、サブクエリを使う方法が一般的でしょう。DMax関数を使っても可能です。

・サブクエリの場合


・DMax関数の場合

DMax関数というのはMS-Access独自の関数なので、いろいろなところでツブシが利くような方法を覚えておきたいという方は、サブクエリの方を使っていきましょう。ただ、DMax関数は(Dなんとかっていう関数は)ある意味、ちょっとしたSQL文を作ってるようなもんなので、書き方が違うだけでやってることはどっちも同じと考えてよいでしょう。

これで、ジョージくんの情報が1行分まるまる出せるわけです。



【参考:SQL文で書くと?】