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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- 高校受験 【受験まで残り3日】誰かアドバイス下さい。もう参考書を全て終わらせる時間が無いです。 私は理社の点数 2 2023/02/11 18:12
- 中学校 理科だけが極端に苦手 5 2022/09/10 14:18
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- 高校受験 あと3ヶ月で偏差値10上げる方法を教えてください 3 2022/12/16 19:14
- 大学受験 条件に当てはまる国公立大学教えてください。 0 2023/04/18 04:00
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- 大学受験 長文失礼します 高3受験生女 愛知教育大学理科 (偏差値50 国立)志望です。 先週の共通テスト模試 5 2022/09/13 00:21
- Excel(エクセル) 非表示にしたい行をグループ化して折り畳み 4 2022/09/17 20:17
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
access・カウント結果がゼロでも、「0」を表示させるには?
その他(データベース)
-
access 存在しない項目を”0件”と表示させるには?
その他(データベース)
-
ACCESS クエリ(カウント0のレコードも表示させたい)
その他(データベース)
-
-
4
count集計の結果が0の場合でも表示したい
SQL Server
-
5
accessで、「集計のオプション」が表示されない
Access(アクセス)
-
6
Accessで“0”ゼロ表示をする
Excel(エクセル)
-
7
ACCESS 「パラメータの入力」を消したい!!
Access(アクセス)
-
8
AccessからExcelにエクスポートする時に常に上書きしたい
Excel(エクセル)
-
9
Acccessで2つのテーブルから1つのフォームをつくりたい
Access(アクセス)
-
10
Access クロス集計結果の空欄にゼロを入れたい
Access(アクセス)
-
11
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
12
アクセスのレポートを印刷すると白紙がでてきます。改ページついて教えてください。
その他(データベース)
-
13
Access クエリの結果が0件だった場合、エラーを表示させる方法
Access(アクセス)
-
14
アクセスのレポートでレコード数をカウントしたい
その他(データベース)
-
15
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
16
ACCESSでデータゼロ件の時レポートが#エラーに
Access(アクセス)
-
17
ACCESS 重複データを1つだけ表示したい(初心者です)
Access(アクセス)
-
18
OR関数
その他(Microsoft Office)
-
19
Access SUMの結果が何もない時0を返す
Access(アクセス)
-
20
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
学校計画について!
-
英検の筆記80~100字だったんで...
-
4/1000とは、0.4ですか?
-
±10%や±5%ってどうやって計算す...
-
【VBA】特定の範囲で同じ値を含...
-
「言う通り」と「言った通り」...
-
アルファベット順の4文字以上...
-
トライの講習会
-
かわいいメアドのアイディア
-
翔という漢字を使ったかっこい...
-
じゃんけん列車の歌
-
「仰せの通り」は「仰る通り」...
-
くもんの採点スタッフ(アルバイ...
-
xy大なり0ならばx大なり0かつy...
-
「過信し過ぎ」はtoo muchの意...
-
家庭教師のトライをWEBで登...
-
お化け屋敷の空気噴射機
-
小学5年の算数の割合問題です。...
-
英語脳で短期間に英単語を沢山...
-
サクラエディタは複数行に渡る...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
高1です。選択科目の理由って...
-
Fラン(偏差値35)大学のセンタ...
-
教科傍用。
-
Accessの集計、0件のデータを表...
-
学校計画について!
-
IQと学力の相関は強そうですがI...
-
物理や化学数学などの教科を勉...
-
教課
-
進研ゼミって金額どれくらい?
-
主要5教科以外の勉強方法を教...
-
論理的思考力について
-
福井県の中学校で教科のタテ持...
-
「明日の時間割教えて」の面白...
-
高校受験を控えた中学生です! ...
-
日本の教育について 日本の教育...
-
小学校国語科教育の難しさと魅...
-
4/1000とは、0.4ですか?
-
英検の筆記80~100字だったんで...
-
「言う通り」と「言った通り」...
-
±10%や±5%ってどうやって計算す...
おすすめ情報