- ベストアンサー
Accessクエリでのグループ化
- Accessクエリを使用して、受付テーブルから社員毎の受付数を取得する方法について説明します。
- 実際にクエリを作成すると、一部の結果が欠けてしまうため、条件を調整する必要があります。
- 受付テーブルと社員テーブルを結合し、受付期間の条件を設定することで、期待する結果を得ることができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
サブクエリを使うのでしょうか。 以下でどうなりますか。 SELECT 社員.名前, IIF(IsNull(T1.社員ID),0,T1.カウント) AS 受付回数 FROM 社員 LEFT JOIN (SELECT 社員ID, Count(*) AS カウント FROM 受付 WHERE 受付日 >= #2010/4/1# AND 受付日 < #2010/5/1# GROUP BY 社員ID) AS T1 ON 社員.ID = T1.社員ID; 社員テーブルを、受付日の範囲でグループ化した社員IDの結果T1と LEFT JOIN で結合します。 この時、社員テーブルにあって T1 に無い社員ID部分は Null となるので、 Null なら 0 へ、そうでなければカウントを受付回数とします。 (Nullのところは見た目、空欄になります) IIF(IsNull(T1.社員ID),0,T1.カウント) AS 受付回数 ↓ T1.カウント AS 受付回数 で確認できると思います。
その他の回答 (4)
- 30246kiku
- ベストアンサー率73% (370/504)
#1です 現在#4までの投稿通知メールが届いていますが、#1のだけ届いてません。 システム上の何かでしょうか。検閲に回っているとか? 質問者さんへの通知は、どうなっているのでしょう? #1のは 受付日 >= #2010/4/1# AND 受付日 < #2010/5/1# の決め打ちでしたが 流動的に指定できるようにしてみました。 クエリを開くと [年月?] を聞いてくるので、 「2010/4」とか「H22/4」とか「平成22年4月」とか入力します。 SELECT 社員.名前, IIF(IsNull(T1.社員ID),0,T1.カウント) AS 受付回数 FROM 社員 LEFT JOIN (SELECT 社員ID, Count(*) AS カウント FROM 受付 WHERE 受付日 >= CDate([年月?]) AND 受付日 < DateAdd("m",1,[年月?]) GROUP BY 社員ID) AS T1 ON 社員.ID = T1.社員ID; CDate や DateAdd 部分で、日にちを指定しないと1日に解釈してもらえます。 後は、[年月?] 記述部分をフォーム参照に変更するとか・・・
- piroin654
- ベストアンサー率75% (692/917)
失礼しました。質問を読み間違えていました。 以下です。 TRANSFORM Nz(Count([受付テーブル].[社員ID]),0) AS 社員IDのカウント SELECT 社員テーブル.名前, Count(受付テーブル.社員ID) AS [合計 社員ID] FROM 社員テーブル LEFT JOIN 受付テーブル ON 社員テーブル.ID = 受付テーブル.社員ID GROUP BY 社員テーブル.名前 PIVOT Format([受付テーブル]![受付日],"oooo") In ("1月","2月","3月","4月","5月","6月","7 月","8月","9月","10月","11月","12月"); 社員全員を表示することを忘れていました。 Nzのくくりをはずせばデータのない部分は Nullで表示されます。
- layy
- ベストアンサー率23% (292/1222)
もう1つクエリを作成し、 ■社員テーブル ID 名前 1 Aさん 2 Bさん 3 Cさん 4 Dさん 5 Eさん ■既存クエリ 名前 受付回数 Aさん 1 Bさん 2 Eさん 1 を紐付けすれば ■社員テーブル ID 名前 (クエリの)受付回数 1 Aさん 1 2 Bさん 2 3 Cさん 0かNULL 4 Dさん 0かNULL 5 Eさん 1 ができると思います。 これではダメでしょうか。
お礼
ご回答ありがとうございました。 サブクエリを使用することにより、イメージ通りの 表示をすることができました。
- piroin654
- ベストアンサー率75% (692/917)
必要なければスルーしてください。 別の観点から。一ヶ月単位での集計ならば、 以下のようなものもあります。 TRANSFORM Count(受付テーブル.社員ID) AS 社員IDのカウント SELECT 社員テーブル.名前, Count(受付テーブル.社員ID) AS [合計 社員ID] FROM 社員テーブル INNER JOIN 受付テーブル ON 社員テーブル.ID = 受付テーブル.社員ID GROUP BY 社員テーブル.名前 PIVOT Format([受付テーブル]![受付日],"oooo") In ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"); 最後のIn以下を除けばデータのある月だけ表示されます。 (30246kikuさんオヒサ)
お礼
ご回答ありがとうございました。 サブクエリを使用することにより、イメージ通りの 表示をすることができました。
お礼
ご回答の確認をするのが遅くなってしまい申し訳ございません。 30216kikuさまの回答にありましたサブクエリで、イメージ通りの表示が できるようになりました。 SELECT 社員テーブル.名前, IIf(IsNull(T1.社員ID),0,T1.カウント) AS 受付回数 FROM 社員テーブル LEFT JOIN [SELECT 社員ID, Count(*) AS カウント FROM 受付テーブル WHERE 受付日>=#4/1/2010# And 受付日<#5/1/2010# GROUP BY 社員ID]. AS T1 ON 社員テーブル.ID = T1.社員ID; 大変勉強になりました。 ありがとうございました。