みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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文で処理可能なのでしょうか?

投稿日時 - 2005-11-07 23:07:10

QNo.1764562

すぐに回答ほしいです

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

サブクエリでネストしても出来ない処理があるのでクエリを分けた方が簡単ですよ。
単純にするなら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.備考;

サブクエリで処理できるところもありますがその辺はご自分でネストしてみてください。

投稿日時 - 2005-11-08 15:48:50

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>UNION句はかなりのヒントになりました。しかし上記をAccessで実行すると。「 1  2010/04/04  シャーペン   A 」の1件のレコードしか取得できませんでした。^^;)

すみません言葉足らずでした。
商品名でグループ化する必要があるので、
最新の売上日取得クエリの商品名の列に「集計」という欄がありますが、これを「グループ化」にして下さい。

投稿日時 - 2005-11-08 00:48:00

補足

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

投稿日時 - 2005-11-08 01:06:06

ANo.1

ユニオンクエリを作成してテーブルAとBを結合し、その結果を基に売上日の最大で取得するクエリにすると良いです。

ユニオンクエリ:
SELECT * FROM テーブルA UNION SELECT * FROM テーブルB

最新の売上日取得クエリ:
SELECT MIN(顧客番号),MAX(売上日),MIN(商品名),MIN(備考) FROM (上記のユニオンクエリ)

この「最新の売上日取得クエリ」を元にするテーブルCのテーブル作成クエリを作れば良いでしょう。

投稿日時 - 2005-11-07 23:46:57

補足

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

投稿日時 - 2005-11-08 00:37:47

あなたにオススメの質問