<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>その他のクエリ
 集計クエリ(Σ) クエリで計算式 クロス集計クエリ 不一致クエリ



■クロス集計クエリ

例えばこのテーブルで

「学部ごとに、成績A、B、Cそれぞれのかせぎの合計がいくらか、計算して出したい」場合、クロス集計クエリーを使ってみましょう。
まずは上のテーブルの中のデータの様子をじっくりと観察しておいてください。

クロス集計クエリーは、ウィザードが用意されています。めんどうでもこれを使った方がよいでしょう。

すると、ちょっと大き目のダイアログボックスが出て来て、何やら指示をしてますね。
まずは、この集計の基になるテーブルを選ばないといけません。

と、そのテーブルの中から、行見出し部分につかうフィールドを選ぶよう指示がでます。

頭の中で、完成したデータシートビューをイメージしてみてください。各レコードの一番左端に並ぶべきフィールドを選び出すのです。

ここでは、[学部]を選びます。そうすると、今4つほど学部が入力されてますんで、経済学部、理工学部、文学部、商学部・・・と、
学部のフィールドが一番左端に並ぶようなイメージになりますね。

で、次に列見出しを選べ、という指示が出ます。横には・・・[成績]を並べましょうか。
これで、「経済学部の成績A、成績B、成績C・・・・」という具合に集計され、それが1レコード分の情報ということになりますね。

さあ、で、その「経済学部の成績A、成績B、成績C・・・・」で、どういう計算結果が必要なのか指定します。[かせぎの合計]にしましょう。


で、なんか適当な名前を付けて、クエリーを開きましょう。

どうでしょう。見栄えはいまいちですけど、ちゃんと計算結果出てますよね。
何にもないところは、「商学部の成績Bの学生は、今のところいない」ということで、計算結果がNull(値がない)ということになります。

こういうクエリーからも、値の入力とかレコードの追加とかできませんよね。それはもうオッケーでしょうか。
ここから入力できちゃったら、基にしている[名簿テーブル]の中身はめちゃくちゃになっちゃいますからね。


あんまり見栄えが悪くてもなんなんで、フォームを作ってみました。表形式のフォームです。
レポートフッターでSum関数を使って、成績A、B、Cそれぞれの合計も算出してみました。


しかし、ここでひとつ考えなくてはならないことがあります。

このフォームの構造は上の通りなんですが、フォームにしてもレポートにしても、「詳細」部分はレコード件数によって数が決まりますが、横に並んでいるテキストボックスは、あらかじめテーブルやクエリーのフィールドとコントロールソースというプロパティで結びついてますよね。

でも、このクロス集計、どうでしょう。もし、「成績D」の人が現れたら・・・。
あるいは、全校とおして「成績C」がひとりもいなかったら・・・。
テキストボックスCは、基にしているフィールドが、クロス集計クエリーの中に見つからず、Accessのフォームやレポートの構造では、対応することができずに開くときエラーになります。

また、「成績D」の学生が現れたとしても、その計算結果はこのフォームからは見ることができないことになります。

クロス集計クエリーを基にレポートやフォームを作成することは、実際には好ましくないことかもしれませんね。
できれば、データシートビューの状態で利用するのがよいでしょう。
レポートやフォームにできるのは、上のように「成績はA、B、Cの三種類のみ。
呼び方も絶対に変らない」という感じで、クロス集計クエリーの開いた結果の横方向の情報がいつも固定できる場合のみです。


え・・・ぜんぜん言ってる意味がわからない???クロス集計クエリーの結果とフォームのデザイン、じっくり見比べてみてくださいね。

例えば、いろいろあってみんな成績が上がったりして、成績の欄を見ると、全員がAかBで、このテーブルの中に「成績がCのレコード」が1件もない場合も、たまにはあるかもしれないじゃないですか。

クエリーは、テーブルの一番新しい状態を拾って開きますから、この状態でさっき作ったクロス集計クエリーを開くと、

当然こうなる。Cはないので、クエリーには「C」というフィールドを設ける必然性がわからないんですね。

と、このクエリーを基にしているフォームも、当然表示すべき値が見つからず#Nameになっちゃう。
#Nameは「Cというフィールドが見つかりません、そんな名前のフィールドありません」というエラーです。
なんかSum関数もエラーになっちゃうんだな・・・。

これはしょうがないですよね。
クロス集計クエリーをレポートやフォームで表示させたいとき、この辺を十分把握した上で、あきらめないといけない場合もあると思います。