![]() |
||
<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関数もエラーになっちゃうんだな・・・。
これはしょうがないですよね。
クロス集計クエリーをレポートやフォームで表示させたいとき、この辺を十分把握した上で、あきらめないといけない場合もあると思います。
![]() |
![]() |
![]() |