
Accessで選択クエリの集計を作りたいのですが…。
例えば、誰が何の質問を受けたか、というような、以下のようなテーブルがあるとします。
【A:データテーブル】
Aさん数学
Aさん理科
Bさん社会
Aさん理科
Bさん理科
【B:教科マスター】
1数学
2社会
3理科
AとBはリレーションでむすんで?あります。
で、Aテーブルを元に集計を使って以下のようにしたいのです。
Aさん理科2件
Aさん数学1件
Aさん社会0件
Aさんだけを抽出するのは、「抽出条件」で絞ればいいと思います。
教科のそれぞれの件数を出すには、「集計」で教科ごとにグループ化して教科をカウントすればいいと思うのですが、どうしても0(ゼロ)件のデータが出てきません。(上記の例で言うと、「Aさん社会0件」が出ない)
0を表示させるにはどこに何を書いたらいいのでしょうか?
No.7ベストアンサー
- 回答日時:
どーも#4です。
DCount("教科ID","データテーブル","教科ID=" & [教科ID] & " And ID=" & [ID])
の意味はクエリの[式ビルダ]の組み込み関数
DCount (<expr>, <domain>, <criteria>)
の
<expr>はカウントするフィールド
<domain>はカウントするテーブル
<criteria>はカウントする条件になります。
<criteria>に"教科ID=1 And ID=2"とすると、<domain>で指定したテーブルの「教科IDの値が1」でかつ「IDが2」のデータのカウントを条件に指定していることになります。
"教科ID=" & [教科ID] & " And ID=" & [ID]
と書くと、「教科IDがクエリの[教科ID]の値」かつ、「IDがクエリの[ID]の値」という条件です。
ちなみに教科ID、IDの両方がもし文字列なら、
"教科ID='" & [教科ID] & "' And ID='" & [ID] & "'"
と書きます。
違うことですが、
>グループまたは集合のないHAVING句です」と出ます。
何をされたのかわかりませんが、私が提示したSQLではグループ化など行っていないのでこういうエラーが出るはずがないのですが・・・(私がテストで抽出したときはWHEREでやりましたし、うまくいきましたよ)
Dcountの使い方、初心者の私でもすっごくよくわかりました!
しかしわかったところで、そもそも今やっているやり方が本番で応用できないということも判明してしまいました…。
回答してくださった皆様には申し訳ないです…
ただ、今作っているDBにおいて、この「0を表示させる」というのがどのクエリでもネックになっていたので、直せばもう少しよくなりそうな気がします。
とりあえず0表示はDcountでできそうです。
ちなみにエラーの件はパラメータ指定したら出ました。
本当にありがとうございました。
No.8
- 回答日時:
No.2です。
いまさら、な感はありますけれど・・・(汗)
どうしても選択クエリでなければだめですか?:
TRANSFORM Count(データテーブル.教科ID) AS 受け数
SELECT データテーブル.人
FROM データテーブル INNER JOIN 教科マスター ON データテーブル.教科ID = 教科マスター.教科ID
GROUP BY データテーブル.人
PIVOT 教科マスター.教科名;
この種の集計ではオーソドックスなクロス集計クエリ、です。
「空白」=「0」となり、「0」表示の目的が「何の質問に答えていないか」の明示だとすれば、用は足りると思うのですけれど。
なお、これは全くの余談ですが、データベースの正規化を考えるのであれば、「データテーブル」は「人マスター」と「データテーブル」に分けた方がよいかと思います。
人マスター:
人
人ID
データテーブル:
人ID
教科ID
このやり方が一番簡単かなーと思いましたが、AさんもBさんも社会を担当しなかったとき、社会はまったく表示されないですね。
実は、他のクエリでクロス集計を使っていますがクロス集計でもゼロが表示されないのも、ネックになっていたりします…。
しかしわかったところで、そもそも今やっているやり方が本番で応用できないということも判明してしまいました…。
回答してくださった皆様には申し訳ないです…(そもそも私の設計ミス?という感じです。ごめんなさい。)
ただ、今作っているDBにおいて、この「0を表示させる」というのがどのクエリでもネックになっていたので、直せばもう少しよくなりそうな気がします。
本当にありがとうございました。
またわからないことがあったら、別途質問させてください。
No.6
- 回答日時:
さっきのSQL文の抜粋です。
SELECT DISTINCT 人
FROM データテーブル
≪絞りたいときは、ここに「WHERE 人 = 'A'」≫ ← 不要なら削除
) AS データ
,教科マスター AS 教化
この部分が括弧でくくられて
「AS 一時データ」として、SQL文で仮想テーブルを作成しているわけです。
私のやりかたは、メジャーなデータベース全般なやり方です。
#4さんのやり方は、Access固有のDCount関数を利用したやり方です。
せっかくAccessを利用しているなら、#4さんのやり型の方がすっきりしていると思います。
別のDBで、どうような処理があってつまずいたら、私のを参考にしてくださるとありがたい^^;
なるほど、わかりました。
わかったところで、そもそも今やっているやり方が本番で応用できないということも判明してしまいました…。
回答してくださった皆様には申し訳ないです…
ただ、今作っているDBにおいて、この「0を表示させる」というのがどのクエリでもネックになっていたので、直せばもう少しよくなりそうな気がします。
とりあえず0表示はDcountでできそうなので、もし都合が悪かったらこちらの方法を試してみたいと思います。
本当にありがとうございました。
No.5
- 回答日時:
すいません。
教化マスターの構造が変でした。
訂正です。
※教科マスター
[構造]
1.教科ID[数値型] ← KEY設定
2.教科名[テキスト型]
[データ]
教科ID 教科名
1 数学
2 社会
3 理科
これが完成したら、再度新規クエリのSQLビューを開いて、先ほどのSQLを張ってみてください。
再度ありがとうございます。
#3で書いていただいたSQL文に「一時データ」と書かれたところがありますが、これはどこから来ているのでしょうか??
あとこの場ですいません、#4で教えていただいた
DCount("教科ID","データテーブル","教科ID=" & [教科ID] & " And ID=" & [ID])
の意味がわからず応用できません。
どなたか"教科ID","データテーブル","教科ID="[教科ID]ID[ID]がそれぞれどのテーブル?から持ってきたものか教えていただけないでしょうか?
No.4
- 回答日時:
こんな風ではいかがでしょう?
--------------------------------------------
※教科マスター
[構造]
1.教科ID[数値型]
2.教科名[テキスト型]
[データ]
教科ID 教科名
1 数学
2 社会
3 理科
※名前マスター
[構造]
1.ID[数値型]
2.氏名[テキスト型]
[データ]
ID 氏名
1 A
2 B
※データテーブル
[構造]
1.ID[数値型]
2.教科ID[数値型]
[データ]
ID 教科ID
1 1
1 3
2 2
1 3
2 3
※クエリSQL文
SELECT 名前マスター.氏名, 教科マスター.教科名, DCount("教科ID","データ","教科ID=" & [教科ID] & " And ID=" & [ID]) AS 合計
FROM 教科マスター, 名前マスター
ORDER BY 名前マスター.氏名;
--------------------------------------------
結合なしで名前マスターと教科マスターでクエリを作り、DCount関数でデータテーブルのデータ数をカウントするというものです。。。
おぉっ!出た!!!!
(ただし、SQLの部分「データ」ではなく「データテーブル」)
ただ、人(実際のデータでは人ではなく、人に当たるデータが300件近くある)での抽出をするとエラーになりました。「グループまたは集合のないHAVING句です」と出ます。
でも、このデータを使ってEXCELで加工しなければならないので、もしかしたらそのままでもいけるかもしれません。ちょっと時間がかかってしまうかもしれませんが、今から実際のデータで試してみて、ご報告します。
ありがとうございました。
No.3
- 回答日時:
※データテーブル
[構造]
1.人[テキスト型]
2.教化ID[数値型]
[データ]
人教化ID
A1
A3
B2
A3
B3
※教科マスター
[構造]
1.人[教化ID] ← KEY設定
2.教化ID[教化名]
[データ]
教化ID教化名
1数学
2社会
3理科
として、クエリを作成
クエリのデザインで、メニューバーより
「表示(V)」 → 「SQLビュー(Q)」
を選択し、メモ帳のような、画面に移動
以下のSQL文をコピペする(≪≫の中は、人を絞るときに必要)
SELECT 一時データ.人,一時データ.教化ID,一時データ.教化名,Count(データテーブル.教化ID) AS 件数
FROM (
SELECT データ.人,教化.教化ID,教化.教化名
FROM
(
SELECT DISTINCT 人
FROM データテーブル
≪絞りたいときは、ここに「WHERE 人 = 'A'」≫ ← 不要なら削除
) AS データ
,教科マスター AS 教化
) AS 一時データ
LEFT JOIN データテーブル
ON 一時データ.人 = データテーブル.人
AND 一時データ.教化ID = データテーブル.教化ID
GROUP BY 一時データ.人, 一時データ.教化ID, 一時データ.教化名
メニューバーより
「表示(V)」 → 「データシートビュー(S)」
を選択し、抽出結果を確認する
回答ありがとうございます。
とりあえず人の抽出はややこしくなるので後回しにして、下のようにやってみました。
(回答の教科マスターの構造が違ってるように見えたので変えてみましたが、間違っていたら教えてください…。)
※データテーブル
[構造]
1.人[テキスト型]
2.教化ID[数値型]
[データ]
人教科ID
A1
B2
A3
A3
B3
※教科マスター
[構造]
1.人[テキスト型] ← KEY設定
2.教化ID[数値型]
[データ]
教科ID教科名
1数学
2社会
3理科
できたクエリ↓
SELECT [データテーブル].[人], [データテーブル].[教科ID], Count([データテーブル].[教科ID]) AS 教科IDのカウント
FROM 教科マスター RIGHT JOIN データテーブル ON [教科マスター].[教科ID]=[データテーブル].[教科ID]
GROUP BY [データテーブル].[人], [データテーブル].[教科ID];
やはり、0件のデータがでないのですが…。
結合は逆もやってみたのですがうまくいきません。
No.2
- 回答日時:
クエリはデザインビューで編集されていますか?
でしたら、以下の操作をしてください:
1)テーブル表示領域で、AテーブルとBテーブルの間の結合線(リレーション)を右クリックします
2)表示されたメニューから「結合プロパティ(J)」を選択します
3)1~3の選択肢の中から、「Aテーブルの全レコードと・・・」と表示されているものを選択し、「OK」をクリックします
以上で、お望みの動作をすると思います。
(出来上がったクエリをビューボタン(デザインビューで表示してるとき、画面左上にある三角定規などのボタン)で「SQL」を選択すると、No.1の方が言われている「Left Join/Right Join」が含まれていることを確認できます)
No.1
- 回答日時:
テーブル結合タイプを外部結合に変更したらよいでしょう。
デフォルトでは内部結合になっています。
sqlでは前者がleft join あるいはright joinで、後者がinner joinです。
回答ありがとうございます。
ですが、結合プロパティは「教科マスターの全レコードとデータテーブルの同じ結合フィールドのレコードだけを含める」になっているのですが、これが間違っているのでしょうか?リレーションは「教科マスター1→∞データテーブル」になっています。回答されているようにしているつもりですが何が間違っているのかわかりません…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教科傍用。
-
高1です。選択科目の理由って...
-
ガソリンが一番安いのは、土日...
-
4/1000とは、0.4ですか?
-
±10%や±5%ってどうやって計算す...
-
「言う通り」と「言った通り」...
-
アルファベット順の4文字以上...
-
115パーセントを小数で表しまし...
-
高校最後の文化祭の劇で白雪姫...
-
かわいいメアドのアイディア
-
「**者のかた」って言いますか?
-
kindle本ってAmazonの電子書籍...
-
製本のビスがはずせない
-
サクラエディタは複数行に渡る...
-
英単語1000個~2000個ってA4用...
-
英語で鑿(ノミ)と彫刻刀
-
英単語に関する質問です 英単語...
-
問題文で「傍線部ⓐⓑⓒⓓⓔの主語を...
-
PDFデータ A-2サイズの2つの...
-
お化け屋敷の空気噴射機
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教科傍用。
-
高1です。選択科目の理由って...
-
Accessの集計、0件のデータを表...
-
Fラン(偏差値35)大学のセンタ...
-
期末テストまで一か月あるんで...
-
教課
-
学校計画について!
-
なぜ小学校ではほとんどの教科...
-
嫌いな(苦手な)教科・科目の...
-
IQと学力の相関は強そうですがI...
-
教育実習日誌
-
今までに習った教科の中で・・・
-
塩化カリウムによる細胞膜の脱分極
-
日本の教育について 日本の教育...
-
4/1000とは、0.4ですか?
-
ガソリンが一番安いのは、土日...
-
±10%や±5%ってどうやって計算す...
-
「言う通り」と「言った通り」...
-
英検の筆記80~100字だったんで...
-
100MBとは0.1GBのことですか?
おすすめ情報