• ベストアンサー

アクセスのクエリーについて

今アクセス97を使用しています。 アクセスのクエリーを使って下記のようなことをやりたいのですが 抽出の条件をどうすればいいかわかりません。 わかる方いらっしゃいましたらお願いします。 説明不足ありましたら補足させていただきます。 A:支店名 B:更新日 C:電話番号 1 青森支店 | 2001/5/20 | aaa-aaaa←――支店名ダブっているときはB:更新日が新しいもの抽出 2 青森支店 | 2001/3/20 | bbb-bbbb 3 岩手支店 | 2001/2/30 | ccc-cccc←――支店名ダブっているときはB:更新日が新しいもの抽出 4 岩手支店 | 2001/2/30 | ddd-dddd 5 宮城支店 | 2001/5/20 | eee-eeee←――支店名ダブっないときそのまま ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A:支店名 B:更新日 C:電話番号 1 青森支店 | 2001/5/20 | aaa-aaaa 3 岩手支店 | 2001/2/30 | ccc-cccc 5 宮城支店 | 2001/5/20 | eee-eeee

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

  • ベストアンサー
  • yoisho
  • ベストアンサー率64% (331/516)
回答No.4

私も以前、同様の処理を簡単に出来ないものかと悩んだことがあります。 結局、一番シンプルなのはyanmaaさんが言われるようにまず以下のようなクエリーをつくり、 SELECT テーブル1.支店名, Max(テーブル1.更新日) AS 更新日の最大 FROM テーブル1 GROUP BY テーブル1.支店名; 次のクエリーで必要なレコードを抽出する方法でしょう。 SELECT テーブル1.支店名, クエリー1.更新日の最大, テーブル1.電話番号 FROM テーブル1 INNER JOIN クエリー1 ON (テーブル1.更新日 = クエリー1.更新日の最大) AND (テーブル1.支店名 = クエリー1.支店名); クエリーをいくつも作りたくないというのなら、サブクエリーを使って、 SELECT テーブル1.支店名, テーブル1.更新日, テーブル1.電話番号 FROM テーブル1 WHERE テーブル1.更新日 = (SELECT MAX(テーブル1_1.更新日) FROM テーブル1 AS テーブル1_1 WHERE テーブル1.支店名 = テーブル1_1.支店名); のようにする方法もあります。 ご質問のそのままのお答えにはなっていませんが、私が実際におこなったのは、元のテーブルに、D:最終データ(True/False型)フィールドを追加して、新規データを入力するたびに、イベントプロシージャで同じ支店の最後の入力レコードのみ、最終データフィールドの値が“True”になるように処理をしてやり、レコードの抽出を単純に以下のクエリーで行う方法でした。 SELECT テーブル1.支店名, テーブル1.更新日, テーブル1.電話番号 FROM テーブル1 WHERE テーブル1.最終データ = True; 私の場合、業務でレコードの抽出を頻繁に行うことから、データのサイズよりパフォーマンスを重視し、クエリーをシンプルにするためにテーブルの方に細工をしました。

その他の回答 (3)

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.3

ええと先にかかれているお二人の回答には不備が有ります。 ついでに質問にも まず質問は ・3,4レコード目が同一支店で同じ日付になっている事 ・2月30日という存在しない日である事 訂正として 3レコード目の日付を3月30日とします。 4レコード目の日付を2月28日とします。 この時No1、2の場合電話番号が最大か最小になる為一致しなくなります。 1 青森支店 | 2001/5/20 | aaa-aaaa 2 青森支店 | 2001/3/20 | bbb-bbbb を例に取ると更新日をMAX取るのは問題有りません。これは大きい方が最新ですから ただし、電話番号の場合、MINならばaaa-aaaaを抽出するし、MAXならbbb-bbbbを抽出します。 よって欲しい結果である 1 青森支店 | 2001/5/20 | aaa-aaaa を出せる保証が有りません。 簡単な方法としては クエリー1で支店名と更新日の一覧を作成する。 この時グループ化を行い、支店名はグループ化、更新日は最大を取るようなクエリーを作成します。 このクエリー1と支店名が入っているテーブルとで支店名と更新日で結合させて抽出すればお望みのものが表示されると思います。

  • hysteric5
  • ベストアンサー率28% (4/14)
回答No.2

支店名をキーとしてグルーピングをしてやれば問題ないと思います。 Sql文の例を掲載しておきます。 SELECT 支店名, Min(更新日), Min(電話番号) FROM Tab GROUP BY 支店名; Minは更新日の中で一番、小さい物を表示すると言う意味です。 更新日で新しいものを表示したいのであればMaxで良いと思います。 デザインビューでクエリを編集する場合は デザインビューを開き フィールドとかテーブルとかって書いてある所で 右クリックをし集計を選択します。 そして支店名のみ新たに出来た集計って所をグループに設定し 他のところは一番、大きい値を表示したい場合は最大、 小さい値の場合は最小、先頭のものを表示したいのであれば先頭 と言う具合に指定してやれば問題ないと思います。

  • taranko
  • ベストアンサー率21% (516/2403)
回答No.1

クエリーの中で集計の表示を出して 支店名でグループ化し、更新日は最大値とし、電話番号は最大値か 最小値にしたらいかがでしょう。 あと、並べ替えで支店名で降順か昇順に並べ替えてください。 いかがでしょうか。

masa2000z28
質問者

お礼

お礼遅くなり申し訳ございません。 回答ありがとうございます。 おかげで目的どおり作成することができました。

関連するQ&A