• ベストアンサー

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。マージするときは、最新の売上日フィールドをもつレコードを取得します。環境はAccess2000です。どんなSQL文を作成すればいいのでしょうか?  また、テーブルAにしかないレコード、又はテーブルBにしかないレコードは、そのままテーブルCに追加したいです。 ※下記テーブルAとBは、Access内に存在します。テーブルCはAとBのマージ後の結果作成されるテーブルです。 テーブルA 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2000-03-03  定規     A    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A テーブルB 顧客番号   売上日   商品名   備考    4  2001-04-04  シャーペン  B    2  2000-02-02  鉛筆     B    3  2001-03-03  定規     B    1  1999-01-01  ふでばこ   B  100  2005-11-11  ワープロ   B テーブルAとBを、最新の売上日の条件でレコードを取得し新しいテーブルCを作成する。 テーブルC 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2001-03-03  定規     B    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A  100  2005-11-11  ワープロ   B SQL文で処理可能なのでしょうか?

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

サブクエリでネストしても出来ない処理があるのでクエリを分けた方が簡単ですよ。 単純にするなら3つ 'qry1として SELECT テーブルA.顧客番号, テーブルA.売上日, テーブルA.商品名, テーブルA.備考 FROM テーブルA UNION SELECT テーブルB.顧客番号, テーブルB.売上日, テーブルB.商品名, テーブルB.備考 FROM テーブルB; 'qry2として SELECT qry1.顧客番号, Max(qry1.売上日) AS 売上日の最大, qry1.商品名 FROM qry1 GROUP BY qry1.顧客番号, qry1.商品名; 'qry3として 'テーブルCを作成するなら SELECT qry2.顧客番号, qry2.売上日の最大 AS 売上日, qry2.商品名, qry1.備考 INTO テーブルC FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号) GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考; '既存のテーブルCに追加するならこちらで INSERT INTO テーブルC ( 顧客番号, 売上日, 商品名, 備考 ) SELECT qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考 FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号) GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考; サブクエリで処理できるところもありますがその辺はご自分でネストしてみてください。

その他の回答 (2)

  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.2

>UNION句はかなりのヒントになりました。しかし上記をAccessで実行すると。「 1  2010/04/04  シャーペン   A 」の1件のレコードしか取得できませんでした。^^;) すみません言葉足らずでした。 商品名でグループ化する必要があるので、 最新の売上日取得クエリの商品名の列に「集計」という欄がありますが、これを「グループ化」にして下さい。

lokki3
質問者

補足

ありがとうございます。しかし、商品名でグループ化しても、その隣のフィールドの「備考」が最小の値である「MIN(備考)」で処理すると、次のような場合矛盾が生じます。テーブルBから最新売上日のレコードをとる時、顧客番号と売上日はテーブルBからとり、備考は、テーブルAからとるという矛盾です。あくまでも、テーブルBから最新のレコードをとった場合、「備考」フィールドもテーブルBからとりたいのです。ご丁寧にありがとうございます。^^

  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.1

ユニオンクエリを作成してテーブルAとBを結合し、その結果を基に売上日の最大で取得するクエリにすると良いです。 ユニオンクエリ: SELECT * FROM テーブルA UNION SELECT * FROM テーブルB 最新の売上日取得クエリ: SELECT MIN(顧客番号),MAX(売上日),MIN(商品名),MIN(備考) FROM (上記のユニオンクエリ) この「最新の売上日取得クエリ」を元にするテーブルCのテーブル作成クエリを作れば良いでしょう。

lokki3
質問者

補足

UNION句はかなりのヒントになりました。しかし上記をAccessで実行すると。「 1  2010/04/04  シャーペン   A 」の1件のレコードしか取得できませんでした。^^;)とりあえず色々やってみます。いい方法がありましたら教えてください。ありがとうございます。

関連するQ&A

  • FileMakerで2テーブルを(仮想的に)マージ

    これまでずっとMicrosoftのAccessを使ってきたのですが、 最近FileMakerを使い始めまして、分らないことだらけです。 以下の実現方法をお分かりの方がいらっしゃいましたらお教えください。 まず、Accessの世界の話をします。 例えば、A.mdb, B.mdb, C.mdbという3つのファイルがあるとします。 A.mdbにはAテーブル、B.mdbには、Bテーブルがあります。 Aテーブルには、(1)商品名、(2)値段、(3)個数、...というフィールドがあります。 Bテーブルには、(1)製品名称、(2)価格、(3)在庫、...というフィールドがあります。 今、C.mdbから、A.mdbのAテーブルとB.mdbのBテーブルを参照して、 これら2つのテーブルをマージして、 例えば、(1)商品名称、(2)定価、(3)在庫数というフィールドを持った Cクエリ(仮想テーブルのようなもの)を作成しています。 以上をFileMakerで実現するには、どうすればよいのでしょうか?

  • Access2002 2つのテーブルのマージ方法

    いつもお世話になっております。 クエリについてお聞きします。 現在、2つのAccessDBが稼動しており、それを1つにまとめる作業をしています。 2つのDBには似通ったテーブルが存在し、それをマージする方法で悩んでいます。 テーブルA ・社員番号 ・社員氏名 ・フリガナ ・会社コード ・部署コード テーブルB ・従業員コード ・従業員名カナ ・従業員名 ・所属コード フィールドの定義としましては、 社員番号=従業員コード 社員氏名=従業員名 フリガナ=従業員名カナ 部署コード=所属コード となります。 全てテキストのレコードです。 これを、テーブルAを正にして、テーブルBのデータをAにマージしたいのです。 要件としましては、 1.テーブルAに存在する社員コードにマッチするレコードはそのまま残す(Bのデータは無視) 2.テーブルAに存在せず、Bに存在するものをAに追加する ということです。 クエリを使って色々試しましたが、どうしてもテーブルAに存在するものもアップデートしてしまい、困っています。 どなたかご教授願えれば幸いです。 よろしくお願いいたします。

  • Access、Aテーブルにあって、Bテーブルにない

    Access初心者です。 Aテーブルに存在するレコードかつBテーブルに存在しないレコードを抽出したい。 例えば、 Aテーブル 100 300 Bテーブル 100 200 の場合、300のみ抽出したい。 どのようにすれば抽出できますか。 よろしくお願いします。

  • マージレプリケーション

    マージレプリケーションについて質問があります。 現在Windows2000 SQLServer2000で、 サーバーAにB,C2台のサーバーがぶら下がっている状態の運用を行っております。 サーバーAとB,Cはマージレプリケーションで同期を取っており、B,Cそれぞれで更新されたデータはAで統合されるようになっております。 パブリッシャーは複数あり含まれるテーブル数はまちまちです。 おききしたい点 ある1つのパブリッシャーで、サブスクリプションが同期を取る際に、 「テーブルがほかのパブリケーションで使用中なので、 プロセスは1つ以上のテーブルを削除できませんでした。」 というメッセージが出てきて、うまく同期が取れなくなってしまいました。 現在、アーティクルに同じテーブルを参照しているパブリケーションは存在しませんので、エラーの出てくるパブリケーションを削除、追加を何度か繰り返したため、B,Cのテーブルに情報が残ってしまったのでは ないかと思われます。 パブリケーションを削除したのですが、B,Cのレプリケーションのサブスクリプションに削除したはずのサブスクリプションが「同期中です」で残っており、これを削除することができません。 正常にパブリケーションを作成しなおしたいのですが、どのようにすればよろしいでしょうか? 当方、初心者でまわりに聞ける人がいないので困っています。申し訳ありませんが、よろしくお願いします。

  • 複数のテーブルに対して・・・

    過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。

  • AテーブルからBテーブルへの展開

    表題のとおりAテーブルのデータを展開し、 BテーブルへINSERTするというPLSQLを考えています。 以下ような感じです。 Aテーブル No 列A1 列B1 列C1 列D1 列A2 列B2 列C2 列D2 列A3 列B3 列C3 列D3 -------------------------------------------------------------- 上記表のデータを Bテーブル No 列BA 列BB 列BC 列BD ------------------------- No 列A1 列B1 列C1 列D1     ←列名の末尾が1のもの No 列A2 列B2 列C2 列D2     ←列名の末尾が2のもの No 列A3 列B3 列C3 列D3     ←列名の末尾が3のもの と、いう感じでBテーブルへ。 Aテーブルの列名は”列A1”のように末尾に数字がついておりBテーブルへは 末尾が同じものを1レコードとしてINSERTします。 これを実現する方法として CURSOR csr IS SELECT * FROM ( SELECT 列A1 ,列B1 ,列C1 ,列D1 FROM Aテーブル UNION SELECT 列A2 ,列B2 ,列C2 ,列D2 FROM Aテーブル UNION SELECT 列A3 ,列B3 ,列C3 ,列D3 FROM Aテーブル ); 上記のようにカーソルで処理してINSERTする以外に方法がありますでしょうか 因みにこの例では1~3項目ですが実際には1~15項目まであります。 BテーブルへINSERTする列数も13列存在します。 DBはORACLE9iです

  • テーブルのマッチングについて

    ORACLE10gを使用しています。 AとB同じレイアウト(キーも同じ)のテーブルがあります。 この2つのテーブルを比較して、 (1)Aテーブルのみにあるもの:1レコードCテーブルに追加 (2)Bテーブルのみにあるもの:1レコードCテーブルに追加 (3)A、B両方にあるもの:2レコードCテーブルに追加 上記に該当するレコードをCテーブルにINSERTしたいです。 実は、Cテーブルに項目が1つ追加されまして「区分」を書く必要があります。 どのパターン((1)か(2)か(3))でINSERTしたデータかです。 (1):1、(2):2、(3):3をセットする どのようにSQLを作成すると実現できるのでしょうか? ご指導よろしくおねがいします。

  • ★Bシェルのファイルマージについて

    ★Bシェルのファイルマージについて 「ファイルA」の一部項目と「ファイルB」の全ての項目を結合し「ファイルC」を 作成するプログラムをBシェルで作成したいのですが、方法がわかりませんので、 どなたかご教授頂けませんでしょうか。 ファイルA.txt 20100904 0 aaa bbb ファイルB.txt ccc 1111 2222 3333 ddd 1111 2222 3333 eee 1111 2222 3333 ファイルA.txtの「20100904 0」をファイルB.txtの各行の先頭に 結合しファイルC.txtを作成する。 ファイルC.txt 20100904 0 ccc 1111 2222 3333 20100904 0 ddd 1111 2222 3333 20100904 0 eee 1111 2222 3333 以上、よろしくお願い致します

  • 売上データに会社毎に請求番号を振る(access

    顧客の売上データ(テーブル)があるのですが、 同じ顧客名で、複数のレコードがあります。 売上を1ヶ月毎に、顧客毎に利用分をまとめて請求書を 作成しています。 下記のように、10月分には、すでに請求書番号(連番)が 入っています。 11月分の売上データの空欄の請求番号のところに、 顧客毎に、自動的に連番(2523~)で請求番号を振る方法がありましたら、 教えてください。どうぞよろしくお願いいたします。 (売上テーブル) 売上日   顧客名 金額  請求書番号 12/10/08 C社  \2000  2511 12/10/09  C社  \5000  2511 12/10/10  C社  \3000  2511 12/10/01  D社  \1000  2522 12/11/01  A社  \2000 12/11/06  A社  \1000 12/11/01  B社  \1000 12/11/08  C社  \2000

  • エクセルについての質問です。

    質問させていただきます。 すでに作成してあるファイルに他のファイルのデータを下の行に継ぎ足したいのですが可能でしょうか。 例: ファイルA  A    B   C 1品名  合計  日付 ←タイトル 2鉛筆  7   1002 3定規  1   1002 4メモ帳 5   1002 ファイルB  A    B   C 1品名  合計  日付 ←タイトル 2筆箱  7   1002 3インク 1   1002 4雑誌  5   1002 ↓↓↓これがこうなります。  A    B   C 1品名  合計  日付 ←タイトル 2鉛筆  7   1002 3定規  1   1002 4メモ帳 5   1002 5筆箱  7   1002 6インク 1   1002 7雑誌  5   1002 通常は1ファイルに1ファイル分を足すだけです。 ただまとめて足したい時もあるので複数ファイルを一気に継ぎ足す方法、もしくはマクロなどもご存知でしたらご教授下さい。 宜しくお願い致します。