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



 menu

55. 自分の次に売上が多い人を横に並べて表示させる

これは・・・相当に難しいわな・・・。
[社員テーブル]を売上順に並べると、こんな感じになってます。

順番に並べれば、「自分の次に売上金額が高い人」がすぐわかりますね。
テーブル全体を見ればすぐ分かることではあるんですが、ばっとテーブルを広げてデータ全体を見て「あ、太郎の次は、ミーコなのか」と確認するわけではなくて・・・横に並べて表示させることはできないかな・・・。
つまり、「ひとつ後のレコードの値を参照する(並び順が昇順ならひとつ前のレコード)」をやってみようというわけです。
これ、マジ難しいです。
簡単にできるかと思ってるとどつぼにはまる可能性大なので、もしかしたらあんまりやらないほうがいいかも・・・。

考え方としては、49.とほぼ同じです。「順位をつけるクエリ」の作り方を理解しておいたほうがいいかもしれません。
今回は、件数をカウントするのではなく「○○以下のもので、最大のもの」を探します。
プラスα、条件が増える感じですね・・・。

まず、同じテーブルをわざと2回選んで、「自己結合」状態にします。
結合線はいりません。

で、[社員テーブル]から[名前]と[売上]、[社員テーブル_1]からも[名前]と[売上]を選びます。
さらに、両方の[売上]を降順で並べ替えてみましょう。

これで、結果を見てみると・・・。いわゆる総当たり戦状態になりますね。
同じテーブルをふたつ選び、結合線を設けてないので、15人×15人分のレコードが直積されて出てきます。

「ジョージvs誰か」の対戦に注目してみると、ジョージの次に売上金額が多いのはぐっさんですね。
右のほうの[名前]と[売上]から、ぐっさんの名前と売上だけを引っこ抜きたいんです。

ということは、どう考えればいいのかな・・・。
[売上]が[売上]より少ないレコードのうち、[売上]が最も多いものを抽出するようなSQL文を作って、これを[売上]の抽出条件にします。


ギャハハ、むつかし〜・・・。
難関は、[社員テーブル]を別名にしているところでしょうかね・・・。
すでに直積をするために[社員テーブル]をダブって選択しているので、[社員テーブル_1]という名前が使われていますよね。なのでサブクエリのほうでは[社員テーブル_2]という名前にしてみました。つまり、このクエリの中で、[社員テーブル]をあたかも違うテーブルみたいなふりして3回も使ってるわけなんです。

と、こうなります。

それらしい結果が出てはいるんですけどね。
うーん、そうか・・・一番最後の、孝三郎のレコードがなくなっちゃいますね。
この人より売上が少ない人はいないからなぁ。

じゃあ、一番売上の少ない人のレコードも出すように条件を追加してみようかな・・・。


うーむ・・・・。

一番下の行、これじゃちょっと変だよなぁ・・・。仕方がないか・・・。
これはもうちょっと考えてみるとしましょう。

今回のクエリの難しさは「横に並べる」というところにあります。
単に、自分の次に売上のいい人を出すだけだったらもっと単純ですが、同じ行として横に並べるためには、こういう方法が必要なのです。RDBの世界では、こういうのはほんとに難しいですね〜




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