• 締切済み

ACCESSで、履歴事項を管理するクエリを作成したい

ACCESSのクエリで悩んでいます。ご回答頂けると幸いです。 <やりたいこと> 更新履歴を残しつつ、現在事項のみを抽出する作成クエリを作りたい。 <元テーブル : 履歴事項 > ID│更新日 │コード│内容1  │内容2  │更新理由 01│4/22│001│あいうえお│かきくけこ│新規 02│5/22│002│さしすせそ│たちつてと│新規 03│5/22│001│なにぬねの│     │はひふへほ 更新があったときは、変更する内容だけを入力し、 変更のない内容はNULLにします。 <作成したいテーブル : 現在事項> コード│内容1  │内容2   001│なにぬねの│かきくけこ 002│さしすせそ│たちつてと コードごとに更新日が最新のものを抽出し、ブランクの内容があったら、 その直近の更新日のものを抽出してくるようにしたいのです。 当方初心者のため、できればクエリのデザイン画面で できる方法があるといいのですが、難しいならSQLも頑張ります。 ご回答、よろしくお願い致します。

  • s-e
  • お礼率70% (85/121)

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

クエリのSQLビューで以下を貼り付け実行してみるとどうなりますか。 SELECT T1.コード, (SELECT TOP 1 Q1.内容1 FROM 履歴事項 AS Q1 WHERE Q1.コード=T1.コード AND Not Q1.内容1 Is Null ORDER BY Q1.更新日 DESC) AS 内容1, (SELECT TOP 1 Q2.内容2 FROM 履歴事項 AS Q2 WHERE Q2.コード=T1.コード AND Not Q2.内容2 Is Null ORDER BY Q2.更新日 DESC) AS 内容2 FROM 履歴事項 AS T1 GROUP BY T1.コード; 直にテーブルを作成するのなら、FROM の前に INTO 現在事項 を入れてみてください。

s-e
質問者

お礼

ありがとうございました。 ただ、やはりSQLが難しいのと、ブランクの内容があったらその直近の更新日のものを抽出となると、ブランクに変更することができなくなるので、更新日ごとにすべての内容を入れるようにして、クエリの2段重ねで作成しました。 クエリ1で、コードをグループ化し、更新日の最大で集計。 クエリ2で、クエリ1のコードと更新日に、履歴事項テーブルをくっつける。 これでなんとなくうまくいきました。 お騒がせして申し訳ありませんでした。

s-e
質問者

補足

ご回答が遅くなって申し訳ありません。 丸写しはよくないと思うので、SQLを理解すべく頑張っているのですが、なかなか難しくて。もう少し頑張ってみます。お時間ください。

関連するQ&A

  • Access クエリで新規テーブルを作成

    お世話になります。 クエリで新規テーブルを作成することは可能でしょうか。 テーブル作成クエリだと、既存のテーブルで抽出した内容で新規に作成する ことになるかと思います。 今回はまっさらな新規のテーブルを作成したいところです。 例えば、フィールド名とデータ型が  ID オートナンバー  受注日 日付型  商品   テキスト型 の場合だと、どのようになりますでしょうか。 ご教授の程、宜しくお願い致します。

  • 選択クエリを基に不一致クエリを作成したけれど...

    識者の力をお借りしたく質問いたします。 質問ページから不一致クエリに関する内容を参考に、ある不一致クエリを作成しています。 しかし、出来るはずの方法で結果が正しく表示されず途方にくれています。 処理の内容としては、あるクエリのフィールドを参考に不一致クエリで差分レコードを抽出したいというものです。 通常不一致クエリはテーブルの主キーを基に作成するものと私は理解しているのですが、今回の処理では基のテーブルに主キーが無く、(作成できない事情があり)クエリで無理矢理主キーもどきのものを作りました。 クエリで作成したのは、数字6桁(最大で)の後ろにチェックディジットとしてアルファベット1文字を追加した計7文字のフィールドです。 例:131401A 不一致を抽出したい基となる2つのテーブルに対しこのクエリを作成しました。 この2つのクエリから不一致クエリで差分を抽出し、基のテーブルに追加クエリで追加したいのですが、どうやっても不一致項目が表示されません。 根本的にクエリからの不一致クエリは作成できないのでしょうか? よろしくお願いいたします。 ■状況 テーブル1/テーブル2(基となるテーブル、主キー無し) クエリ1/クエリ2(テーブル1/テーブル2のレコードにコードを追加するクエリ) コード1/コード2(クエリ1/クエリ2で作成したコード)例:131401A 不一致クエリ テーブル2 → テーブル1 (リレーションシップ) コード2 条件:Not Null ※テーブル2の方が最新レコードが入っているので、テーブル2の差分レコードをテーブル1に追加したいというのが基本的な内容です。 よろしくお願いいたします。

  • Accessで作ったクエリーを使ってさらに更新する方法

    Access97のクエリーを使ってデータの抽出や更新を行なっています。Accessでは作成したクエリーを使ってさらにクエリーを作れると思うのですが、うまくいきません。 内容は以下のとおりです。 (1)ある条件で「抽出クエリー1」を作る (2)別の「テーブル」と「抽出クエリー1」をキーマッチングさせ、マッチしたものだけ「テーブル」を更新させたい。 やりたいことは単純なのですが、これを行なうと 「更新可能なクエリーでなくてはいけません」とメッセージが出てしまい、更新できません。作ったクエリーがいけないのかと思い、一度エクセルにエクスポートし、再度アクセスにテーブルとしてインポートするとうまくいきました。ですが、こんな面倒な方法はやってられません。 作ったクエリーを再び別のクエリーで使う為にはどうしたらよいのでしょうか? ちなみに、選択クエリーや追加クエリーではこのようなことが起こったことはありません。 アクセスに詳しい方、どうかよろしくお願いします。

  • ACCESS 更新クエリについて

    更新クエリで更新したいのですが、クロス集計クエリの数値を元にテーブルを更新することは出来ないようで、困っています。 なぜそのようなことをしているかと申しますと、 商品品目_個数_コード(主キー) のようにフィールドを持っているのですが、 印刷に関しては品目ごとに印刷したい、ということで 一度クロス集計クエリ(TRANSFORM)で りんご_ばなな_ぶどう_コード(主キー) 数値_数値_数値_数値 のような並びにして、テーブル作成クエリでテーブルを作成し そのテーブルをレポートに使用しています。 数値などが変わった場合その作成したテーブルの数値を 作成元になったクロス集計クエリで更新したいのですが、出来なくて困っています。 テーブル作成クエリで上書きすると、古いデータが消えてしまうため 何か良い方法はないかと思っています。 回答のほどお願いします。

  • Accessのクエリについて

    Accessの初心者です。 “クエリ”がよくわからなくて困っています。 (1)テーブルの情報を更新した場合、クエリも自動で内容が更新するのでしょうか? 複数のクエリがある場合、テーブル更新後すぐにアクセスを閉じて、次にアクセスを起動させた時はクエリの内容も更新されるか。 それとも、テーブル更新後に各クエリを実行しないと更新しないとでしょうか。 (2)クエリ実行後、表示されたデータの一部を書き換えて出力した場合、元のテーブルの内容も変更されてしまうのでしょうか。 教えてください。 どうぞよろしくお願い致します。

  • VBAからADOを使ってクエリのクエリを作成したい

    VBAからADOを使ってクエリのクエリを作成したい ADO初心者です。 VBA側で入力された引数を元に、ADOを使ってあるmdbファイルにあるクエリ(1)の抽出条件を変更した上で(抽出条件はVBA側の引数によって毎回変わります)、クエリ(1)の中から重複したレコードを抽出するクエリ(2)を作成したいと考えています。クエリ(1)並びにクエリ(2)をそれぞれ単独で作成する事は出来たのですが、クエリ(1)の結果を反映したクエリ(2)を作成する方法が分かりません。 なお、クエリ(1)の抽出条件変更は、RecordsetオブジェクトのOpenメソッドを使って行っています。何となくこれはレコードの更新は出来てもクエリの更新は出来ないような気がしており、それが原因のような気がしているのですが、クエリの更新をしたい場合はどうすればよろしいでしょうか?

  • office(Access)のクエリーの作成について

    未熟者ですがよろしくお願いいたします。 テーブルから条件に合致したデータを抽出するクエリを作成しレポートを作成したいのですが、レポートを表示する前にクエリの抽出結果が表示されてしまいます。クエリの表示をせずレポートのみ表示させたいのですが何か設定があるのでしょうか?  ただし、まだ作成が不十分でクエリで抽出したい項目の一つのパラメータを入力するボックスが開き、それを無視してOKボタンをクリックするとクエリの抽出結果とレポートが同時に表示されます。 ひょっとしてこれが原因なのでしょうか?

  • Accessフォームの規定値の設定について

    履歴を管理するフォームを作りたくて困っています。 ご指導お願いいたします。 <やりたいこと> 単票形式のフォームで新規入力をしたとき、コードの欄を入力すると、そのコードの最新更新日の名称などが、規定値で出てくるようにしたい。 <テーブル:履歴事項> ID│コード│名称        │住所│更新日 01│001│あいうえお有限会社│東京│5月1日 02│002│かきくけこ株式会社│大阪│5月2日 03│001│あいうえお株式会社│東京│5月3日 <フォーム:新規レコード登録時> ID : オートナンバー コード: 001        ←コードを入力すると… 名称 : あいうえお株式会社  ←名称や 住所 : 東京         ←住所が規定値として出てくるようにしたい 更新日: =now() コードを入力すると、そのコードの最新更新日の内容が規定値として表示され、その内容から変更になったところだけ入力したいのです。 ちなみに最新更新日の内容だけ集めたクエリ「現在事項」というのもあるのですが、役に立つでしょうか? VBAを使わなくてもできる方法があると助かります。 よろしくお願い致します。

  • Accessのクエリ作成について

    クエリを作成する際の、テーブルの設定の仕方がよくわかりません。 たとえば、「顧客リスト」テーブルと「販売履歴」テーブルに、それぞれ「顧客ID」フィールドがあり、「顧客ID」フィールドがリレーションシップで設定されているとします。 新たに、選択クエリを作成し、そのクエリに、「顧客ID」フィールドを設定するときに、どちらのテーブルの「顧客ID」フィールドを設定するかがわかりません。 ちなみに顧客IDフィールドには、リレーションシップを設定していて、1対多の設定をしています。 「顧客リスト」テーブルの「顧客ID」フィールドが、「1」の側で、 「販売履歴」テーブルの「顧客ID」フィールドが「多」の側です。 どちらのテーブルを使用しても結果は同じなのですが、 選択クエリを作成するときに、上記のように、同じフィールドを持テーブルが2つありリレーションシップを 設定している場合は、どちらのテーブルを使わないといけないというような決まりはあるのでしょうか? どちらを使用しても構わないのでしょうか。 特に、決まりがない場合は、一般的には、どのように設定されているのでしょうか?

  • Accessのクエリ作成について

    クエリを作成する際の、テーブルの設定の仕方がよくわかりません。 たとえば、「顧客リスト」テーブルと「販売履歴」テーブルに、それぞれ「顧客ID」フィールドがあり、「顧客ID」フィールドがリレーションシップで設定されているとします。 新たに、選択クエリを作成し、そのクエリに、「顧客ID」フィールドを設定するときに、どちらのテーブルの「顧客ID」フィールドを設定するかがわかりません。 ちなみに顧客IDフィールドには、リレーションシップを設定していて、1対多の設定をしています。 「顧客リスト」テーブルの「顧客ID」フィールドが、「1」の側で、 「販売履歴」テーブルの「顧客ID」フィールドが「多」の側です。 どちらのテーブルを使用しても結果は同じなのですが、 選択クエリを作成するときに、上記のように、同じフィールドを持テーブルが2つありリレーションシップを 設定している場合は、どちらのテーブルを使わないといけないというような決まりはあるのでしょうか? どちらを使用しても構わないのでしょうか。 特に、決まりがない場合は、一般的には、どのように設定されているのでしょうか?

専門家に質問してみよう