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
ACCESS 「パラメータの入力」を消したい!!
Access(アクセス)
-
5
count集計の結果が0の場合でも表示したい
SQL Server
-
6
accessで、「集計のオプション」が表示されない
Access(アクセス)
-
7
アクセスのレポートでレコード数をカウントしたい
その他(データベース)
-
8
Accessで“0”ゼロ表示をする
Excel(エクセル)
-
9
OR関数
その他(Microsoft Office)
-
10
ACCESS DCOUNTの抽出条件について
Access(アクセス)
-
11
アクセスのレポートを印刷すると白紙がでてきます。改ページついて教えてください。
その他(データベース)
-
12
アクセスで複数列にまたがる同一名義の個数を集計出来ますか?
Access(アクセス)
-
13
Acccessで2つのテーブルから1つのフォームをつくりたい
Access(アクセス)
-
14
ACCESSのフォームで次のレコードに移動しない方法を教えてください
その他(データベース)
-
15
ACCESSで、EXCELのような、sumif関数のような関数ってありますか?
Access(アクセス)
-
16
Accessのクロス集計→テーブル作成で値がない場合の対処法
Access(アクセス)
-
17
Accessのテーブルのフィールドに式を入れる方法
Access(アクセス)
-
18
アクセスのフォームのビューが表示されないのですが、
その他(データベース)
-
19
ACCESS 重複データを1つだけ表示したい(初心者です)
Access(アクセス)
-
20
Accessの条件付き書式設定で、複数の条件が一致した時の書式を設定したい
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
高1です。選択科目の理由って...
-
Fラン(偏差値35)大学のセンタ...
-
教科傍用。
-
Accessの集計、0件のデータを表...
-
4/1000とは、0.4ですか?
-
英検の筆記80~100字だったんで...
-
英語で鑿(ノミ)と彫刻刀
-
英単語1000個~2000個ってA4用...
-
±10%や±5%ってどうやって計算す...
-
サクラエディタは複数行に渡る...
-
重複しないグループ分けをエク...
-
chrome起動したら「uBlock Orig...
-
Webで掲載している記事に関して...
-
「言う通り」と「言った通り」...
-
合唱祭の楽曲紹介 「翔る川よ」
-
「**者のかた」って言いますか?
-
斉藤さんって“まとも”な人はと...
-
0.25を百分率で表しましょう
-
その通り その道理
-
日本語論文を書く際の英単語の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
高1です。選択科目の理由って...
-
教科傍用。
-
学校計画について!
-
Accessの集計、0件のデータを表...
-
進研ゼミって金額どれくらい?
-
一番好きな教科と嫌いな教科は...
-
塩化カリウムによる細胞膜の脱分極
-
群馬大学の医学部に入りたいの...
-
なぜ小学校ではほとんどの教科...
-
「明日の時間割教えて」の面白...
-
Fラン(偏差値35)大学のセンタ...
-
あと○点で平均○点
-
学力テストの解き直し
-
日本の教育について 日本の教育...
-
高校受験を控えた中学生です! ...
-
小6女子です。 算数と英語が苦...
-
教課
-
物理や化学数学などの教科を勉...
-
小学校国語科教育の難しさと魅...
-
2年11月進研模試の教科選択...
おすすめ情報