マイクロソフトアクセスで下記のように2つのテーブルを統合する方法を教えて頂けますでしょうか。


テーブル1
ID 名称 住所
1 Aホテル 東京
2 Bホテル 大阪
3 Cホテル 名古屋

テーブル2
ID 設備タイプ 設備名
1 ホテル設備 ベビーシッター
1 ホテル設備 レストラン
1 レジャー設備 マッサージ
1 レジャー設備 フィットネス
1 部屋設備 エアコン
1 部屋設備 バルコニー
2 レジャー設備 フィットネス
2 レジャー設備 スイミング
2 部屋設備 エアコン
2 部屋設備 ドライヤー
3 ホテル設備 レストラン
3 ホテル設備 ランドリー
3 部屋設備 エアコン
3 部屋設備 バルコニー

テーブル統合後
ID 名称 住所 ホテル設備 ホテル設備 レジャー設備 レジャー設備 部屋設備 部屋設備
1 Bホテル 東京 ベビーシッター レストラン マッサージ フィットネス エアコン バルコニー
2 Bホテル 大阪 フィットネス スイミング エアコン ドライヤー
3 Cホテル 名古屋 レストラン ランドリー エアコン バルコニー


データ数は合計3万件以上、ソフトはアクセス2003を使用しています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/12/12 00:06:00
  • 終了:2007/12/19 00:10:03

回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/12/12 04:16:08

ポイント60pt

ステップ1)設備タイプ毎に仮の通し番号を付けるためのクエリを造る

クエリA

SELECT DCOUNT("*","ホテル設備","ID=" & ID & " AND 設備タイプ=""" & 設備タイプ & """ AND 設備名<""" & 設備名 & """")+1 AS 通し番号, *
FROM テーブル2;

実行結果

通し番号 ID 設備タイプ 設備名
1 1 ホテル設備 ベビーシッター
2 1 ホテル設備 レストラン
2 1 レジャー設備 マッサージ
1 1 レジャー設備 フィットネス
1 1 部屋設備 エアコン
2 1 部屋設備 バルコニー
2 2 レジャー設備 フィットネス
1 2 レジャー設備 スイミング
1 2 部屋設備 エアコン
2 2 部屋設備 ドライヤー
2 3 ホテル設備 レストラン
1 3 ホテル設備 ランドリー
1 3 部屋設備 エアコン
2 3 部屋設備 バルコニー

ステップ2)設備タイプ毎に何列ずつ必要になるかを調べる

上記例では

  ホテル設備は1つのホテルで最大2つ

  レジャー設備も1つのホテルで最大2つ

  部屋設備も1つのホテルで最大2つ

ここでは偶然にも2つずつとなりましたね。

ステップ3)統合用クエリを造る

クエリB

SELECT ID,名称
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""ホテル設備"" AND 通し番号=1") AS ホテル設備1
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""ホテル設備"" AND 通し番号=2") AS ホテル設備2
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""レジャー設備"" AND 通し番号=1") AS レジャー設備1
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""レジャー設備"" AND 通し番号=2") AS レジャー設備2
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""部屋設備"" AND 通し番号=1") AS 部屋設備1
    ,DLookup("設備名","クエリA","ID=" & ID & " AND 設備タイプ=""部屋設備"" AND 通し番号=2") AS 部屋設備2
FROM テーブル1

実行結果

ID 名称 ホテル設備1 ホテル設備2 レジャー設備1 レジャー設備2 部屋設備1 部屋設備2
1 Aホテル ベビーシッター レストラン フィットネス マッサージ エアコン バルコニー
2 Bホテル     スイミング フィットネス エアコン ドライヤー
3 Cホテル ランドリー レストラン     エアコン バルコニー

補足1)動作テストについて

Access2000で作成しましたので以降のAccessならば使えるはずですが

3万件のデータを作成してテストしたわけでもありませんので悪しからずご了承ください。

(処理が遅いようであればクエリA、クエリB共に

WHERE句でIDを範囲指定するなどの処置を施していただければと思います)

補足2)並び順について

データベースの場合、明確な並び順がありませんので今回の場合は

アイウエオ順になっておりますが、どうしても例えばスイミング→フィットネスではなく

フィットネス→スイミングにしたいということであれば

その並び順を示すようなテーブルを新規作成して上記クエリAを適宜改良してください。

補足3)完全自動化について

ステップ2の部分をVBAにて補うようにすれば完全自動化も可能ですが

そこまでするのであればテーブル1のデザインを

ID 名称 住所 ベビーシッター レストラン フィットネス マッサージ エアコン バルコニー

といったような形に変えてしまう事をお勧めします。


コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません