• ベストアンサー

ACCESSで重複データをまとめたいのですが・・・

ACCESSでアンケートを集計しています。 顧客名簿テーブルとアンケートテーブルがあり、 2つのテーブルは顧客IDで関連しています。 各テーブルを簡略化すると以下の通りです。 <顧客名簿テーブルのフィールド> 顧客ID(オートナンバー型)、名前(テキスト型)、住所(テキスト型) <アンケートテーブルのフィールド> アンケートID(オートナンバー型)、顧客ID(数値型)、回答1(数値型)、回答2(テキスト型)、回答3(メモ型) 顧客名簿テーブルとアンケートテーブルを顧客IDでつなげたクエリを作成し、 検索フォームでアンケートの内容で検索しています。 検索で絞り込んだ顧客を、レポートを作って リスト印刷したり宛名印刷したりしたいのですが、 アンケートに数回答えてる人は何回も出てきてしまいます。 これを一人1回だけ出てくるようにしたいのですが、 どうしたらよいのでしょうか? クエリをグループ化しようとしましたが、 メモ型フィールドがあるとダメみたいです。 ACCESS97を使用し、Windows98~XP Proで動かしています。 初心者ですので細かく教えていただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.2

まず、アンケートテーブルからメモ型の回答3を除いた アンケートID(オートナンバー型)、顧客ID(数値型)、回答1(数値型)、回答2(テキスト型) だけのクエリーを作成しこのクエリーに対してグルーピングや選択を行う。 (ただしこの時点で回答1及び2に対して同じ人が違う回答を出している場合はグループ化されず複数出てきてしまいます。この場合はアンケートテーブルの顧客IDとアンケートIDだけのクエリーを作成し、グループ化しアンケートIDで最小(一番最初に答えた物)或いは最大(一番最後に答えた物)の物を選ぶようにしてみるといいかもしれません) その後で、できたクエリーに対して顧客名簿テーブルとアンケートテーブルの回答3を結合させて見てください。 このクエリーからさらに絞り込んだり、レポートに渡したりしてみてください。

fukusukeibuki
質問者

補足

ご回答ありがとうございます。 keikanさんの方法だと、確かに顧客は重複しなくなります。 ただし、アンケート内容は最小(一番最初に答えた物)か最大(一番最後に答えた物)の内容しか フィルタの対象にならないです。 全てのアンケートが対照になる方法はないでしょうか? 「例えば検索結果でテーブルを作る」でも良いのですが。 欲張ってしまってすみません!よろしくお願いします!

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.7

レポートのクエリーの検索条件にフォーム上の値を渡してあげてください。 =forms![検索フォーム]![感想]   (たぶん非連結の項目になってると思いますが) これで、検索フォーク上にある感想コントロール(テキストボックス等)の値と同じ物を拾ってくるようになります。 またはマクロが使えるならば DoCmd.OpenReport stDocName, acPreview, , sqlstrとして、 sqlstrに検索条件を付加すると元のレポートに対して絞り込みを行って実行できます。

fukusukeibuki
質問者

お礼

なんだか理解できなくなってきました^^;; とりあえず、今まで皆さんからいただいた回答を試して見ます! 試してみてダメだったら今度は別の観点から質問を考えてスレを立てます! ご協力誠にありがとうございました!!m(*u_u*)m

すると、全ての回答が全文表示されます。
  • keikan
  • ベストアンサー率42% (75/176)
回答No.6

#2です。 クエリーでグループ化等をするとその結果に対して選択を行うので、意図的にまず選択してからグループ化してください。 クエリーを1度で行わず必要に応じていくつかに分けてください。 まずはじめにテーブルを結合して、条件にあった物だけ選択するクエリーを作成する。 そしてそのクエリーを元にグルーピングして重複を省くクエリーを作成する。 このクエリーを元にレポートを作成してください。

fukusukeibuki
質問者

補足

たびたび回答ありがとうございます! で、また質問しちゃってもいいでしょうか…^^;; 段階を踏んでクエリを作っていくのはわかりましたが、検索フォームに入力された検索条件を段階的にクエリに適用していく方法がわかりません。 今は先述の通り、検索条件を印刷レポートに全部渡して検索フォームでフィルタをかけて条件に合致したものだけ印刷しているんです。 これだといくらクエリをわけようとしても、印刷する段階で全フィールドが必要になってしまうんです。 しつこいようですけど、もしお分かりになりましたらまたお付き合いくださいm(*u_u*)m

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.5

>keikanさんの#2の通り、顧客IDをグループ化してアンケートIDを最大か最小にする(アンケートを最初の回答か最後の回答1つにしちゃう)と、「おいしくない」で検索したときにAさんが印刷に出てこなくなっちゃうんです。 ここまで出来ているのであれば、「回答」をグループ化し、○か×でフィルター(SQLであればWhere)を掛けるだけのことだと。

fukusukeibuki
質問者

補足

回答ありがとうございます。 #4であげた例では回答は○、×しかありませんが、質問にあるように回答はそれだけではなくメモ型もあるんです。なので単純にはグループ化できないんです。 #6の補足に続く>>

すると、全ての回答が全文表示されます。
  • keikan
  • ベストアンサー率42% (75/176)
回答No.4

#2です >検索で絞り込んだ顧客を、レポートを作って >リスト印刷したり宛名印刷したりしたいのですが、 >アンケートに数回答えてる人は何回も出てきてしまいます。 >これを一人1回だけ出てくるようにしたいのですが、 >どうしたらよいのでしょうか? 何がしたいのでしょうか?^^;; この答えが先ほどの#2何ですが・・・・・ もしかすると、 名前AさんがアンケートにX回答えたとしたときのレポートとして 名前Aさんに対して アンケート1 アンケート2 アンケート3 ・ ・ ・ アンケートX 名前Bさん アンケート1 アンケート2 みたいな感じにしたいんでしょうか?^^ このような物であれば まずアンケートテーブルから帳票形式のレポート(子レポートとします)をふつうに作成します。もちろんこのレポートは全部のレコードが出てきます。 次に、顧客名簿テーブルからレポートを作成し(親レポートとします)このレポートにサブレポートとして先のアンケートテーブルのレポート(子レポート)を入れてください。 そして顧客IDで親レポートと子レポートリンクさせます。 これで、親レポートを開くとその顧客に対応したアンケートの一覧が表示されるはずです。

fukusukeibuki
質問者

補足

いえいえ、そうではないんです。 例えば、らーめんに対するアンケートがあるとします。  名前:住所:食べたらーめん:感想 Aさん:東京都:醤油ラーメン:○おいしかった Bさん:埼玉県:味噌らーめん:○おいしかった Aさん:東京都:味噌らーめん:×おいしくない Cさん:栃木県:醤油らーめん:×おいしくない Aさん:東京都:豚骨らーめん:○おいしかった だとして、これをおいしかった人だけ検索して次のように印刷したいのです。 Aさん:東京都 Bさん:埼玉県 それが、私がつくったものでやると、 Aさん:東京都 Aさん:東京都 Bさん:埼玉県 Aさんがおいしいと2回答えているので2回でてきてしまうんです。 で、keikanさんの#2の通り、顧客IDをグループ化してアンケートIDを最大か最小にする(アンケートを最初の回答か最後の回答1つにしちゃう)と、「おいしくない」で検索したときにAさんが印刷に出てこなくなっちゃうんです。 なのでkeikanさんの#2の回答では希望の機能ができないんです。 私の作り方がまづいだけなのでkeikanさんにはレスをいただいただけで感謝はしてるんですが…。

すると、全ての回答が全文表示されます。
  • NorthMole
  • ベストアンサー率24% (20/82)
回答No.3

#1です 端的に行ってしまえば、検索フォームとレポートのそれぞれのレコードソースの定義が異なるので、それぞれを独立したクエリーとして定義することをお勧めします。 フィルタの定義をそのまま流用したいということだと思いますが、 グルーピングを行ないたいクエリーにこれを適用するのは難しいと思います。 フィルタの内容にも依り、ノウハウ⇒マクロ、VBAなどが必要になるかと思います。 というか、私の場合は、厄介そうな内容は、VBAに走っちゃいますけど(笑)

fukusukeibuki
質問者

お礼

度々ありがとうございます。 グループ化とかで解決しないなら・・・と思い、 VBAの本やネットの情報を拝見して、フィルタで抽出した顧客の顧客IDを全部読んでレポートに渡せば顧客テーブルだけでイケる!…なんて考えたりもしましたが、時間がないし、技術もないので(面倒なので?)諦めました…。 よくありそうな事例だと思うんですけど、実現は結構難しいんですねー。

すると、全ての回答が全文表示されます。
  • NorthMole
  • ベストアンサー率24% (20/82)
回答No.1

検索フォームの定義をどうしているのかわからないんですが、 <検索で絞り込んだ顧客>ということは、これを実施するのと同様のクエリー(クエリーAととりあえず名づけておきます)を作成できるということですよね。 ということは、クエリーAに対して、宛名に必要な情報のみを選択してグループ化するクエリーBを作成すればよいと思うのですが・・・。 クエリーBには回答とかはいらないでしょうから。

fukusukeibuki
質問者

補足

回答ありがとうございます。補足させてください。 検索から印刷までの流れですが、 検索フォームでクエリA(顧客名簿とアンケートテーブルをくっつけただけ)にフィルタをかけて条件にあったアンケート内容とその顧客名をフォームに表示します。 これを印刷する際は、宛名印刷レポートがクエリAを読み込み、検索フォームのフィルタを受け継いで再度絞込みをかけているんです。 この作り方だと宛名印刷レポートに渡すクエリから回答内容を削ることができないのです。 せっかくご回答いただいたのですが、私の作り方がわるくて申し訳ありません。 きっとこのフィルタを渡して印刷するのが間違いなんだとは思うのですが、別の方法が思いつきません…。 「普通はどのようにして検索結果を印刷してるのか?」という質問になってしまうかもしれません。

すると、全ての回答が全文表示されます。

関連するQ&A