- ベストアンサー
Accessで複数フィールドを1フィールドに結合する方法
- Accessで委員名簿テーブルと行事テーブルを結合する方法について教えてください
- Access 2003を使用しています。委員名簿テーブルと行事テーブルを結合して、クラスごとの生徒の参加状況を表示したいです
- テーブルを結合して新しいテーブルを作成する方法について教えてください
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
一応、質問の範囲での回答とします。 たとえば、以下のような「委員会名簿テーブル」があるとします。 フィールドの生徒名は生徒名6でも、生徒名100でもフィールドが 設定できるまでかまいません。 クラス 生徒名1 生徒名2 生徒名3 生徒名4 生徒名5 1-1 田中 佐藤 西田 山崎 内藤 1-2 東 南田 中川 1-3 豊臣 田中 中田 今井 1-4 谷 道上 1-5 徳川 佐竹 佐藤 西岡 中川 これを以下のようなテーブルに簡単に変更できますか? また、下記では質問の最終的な結果を得るには下記の ように「生徒ID」という各生徒を一意に区別するフィールドが 必要になります。これは最後に作るクエリで必要であるということと、 同じクラスあるいは他のクラスに同じ苗字の人物が存在する可能性が あるかもしれないからです。 生徒ID クラス 生徒名 1 1-1 佐藤 2 1-1 西田 3 1-1 山崎 4 1-1 内藤 5 1-2 南田 6 1-2 中川 7 1-3 田中 8 1-3 中田 9 1-3 今井 10 1-4 道上 11 1-5 佐竹 12 1-5 佐藤 13 1-5 西岡 14 1-5 中川 もし、データが多くて大変だというのであれば、以下のようにしてみてください。 (1) 以下のようなテーブルを作ります。 生徒ID 数値型 主キーを設定します。 クラス テキスト型 生徒名 テキスト型 テーブルの名前を「委員会名簿テーブル」とします。 元の「委員名簿テーブル」を「委員会名簿テーブル元」 とします。 (2) 次に分かりやすく実行できるようにするために、 フォームを作り、そこにボタンを一つ設定します。 ボタンのクリック時のイベントに以下を設定します。 なお、ボタンの名前は出来上がったボタンの名前の ままでいいです。 Private Sub コマンド0_Click() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Integer Dim j As Long Set db = CurrentDb Set rs1 = db.OpenRecordset("委員会名簿テーブル元") Set rs2 = db.OpenRecordset("委員会名簿テーブル", dbOpenDynaset) j = 1 rs1.MoveFirst Do Until rs1.EOF For i = 2 To rs1.Fields.Count - 1 If rs1.Fields(i) <> "" Then rs2.AddNew rs2!生徒ID = j rs2!クラス = rs1!クラス rs2!生徒名 = rs1.Fields(i).Value rs2.Update j = j + 1 End If Next i rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub 次に、コード表のコマンドバーのツールから 参照設定を選択し、Microsoft DAO xx Object Library の項目に チェックを入れ、OKとします。なお、xx は3.6のような数字です。 (3) (1)、(2)ができたら、ボタンを押して「委員会名簿テーブル」 を確認してみてください。 (4) 次に、「行事Aテーブル」と「行事Bテーブル」 数値型の「生徒ID」というフィールドを追加し、できた「委員会名簿テーブル」 を参照して「クラス」と「生徒名」に合致した「生徒」を入れていってください。 本来は「生徒ID」があれば「生徒名」はこれらのテーブルでは必要はないのですが。 これらのテーブルの「生徒ID」は主キーを設定しません。 たとえば以下のように。 行事Aテーブル 生徒ID 生徒名 参加 1 佐藤 True 3 山崎 True 6 中川 True 行事Bテーブル 生徒ID 生徒名 参加 1 佐藤 False 6 中川 True 13 佐藤 True 14 中川 True (5) 最後にクエリを作成します。下記のSQL文を新しいクエリを SQLビューにして、貼り付けます。 SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加 FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID; あるいは、以下のようにしてもいいですが、こちらはフィールド名を変更しています。 変更は手動で書き変える必要があります。 SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加 FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID; 上記のクエリをデザインビューで確認すると、「委員会名簿テーブル」 から「行事Aテーブル」と「行事Bテーブル」に結合線が向かっている ことに注目してください。行事テーブルが追加されるような場合は 結合線の設定を同じようにしてください。 以上です。 わからないところがあれば補足してください。
その他の回答 (4)
- nicotinism
- ベストアンサー率70% (1019/1452)
現状のテーブル設計だと行事が増えるごとに、クラスの入れ替えや増減があるごとに クエリを修正しなくてはなりません。 また、そのクエリ自体が難しくはなくとも長いSQLになってしまい遅くなります。 さらに、同姓同名の生徒が存在する場合には・・。 http://support.microsoft.com/kb/283878/ja なので、生徒IDのような一意のフィールドを加え 委員名簿 クラス 生徒名 生徒ID 1-1 山田治夫 1 1-2 佐藤博 2 ・・・・・・・・・・・・ 行事 行事名 参加 生徒ID 潮干狩り True 2 潮干狩り False 1 運動会 True 1 運動会 True 2 のようなテーブル設計にして クエリ1では双方の生徒IDで結合線を引きます。 クエリ1を元にしてクロス集計クエリで最終的なモノが得られます。
お礼
同姓同名は、考えていませんでした・・・ やはり1意のテーブル構造にすることが基本ですね。 ご指摘のように、並び替える複数のクエリを作って、 クロス集計クエリでできました。 お礼をつける前に、VBAでの並び替えの方法を載せてくださった方がいたので、 今回は、そちらの方に、ポイントをつけました。 基本を叩き込むことができました。 ありがとうございました。
- tamiemon96
- ベストアンサー率49% (658/1341)
No.2です。 アクセスで、データ同士をリンクさせるなら、1フィールド、1データにしないと、です。 ただ、質問者様のイメージされるフォームは、 生徒1名に対して、各行事答えが1つづつのため エクセルに向いている内容に思えます。 例えば、行事欄が1つで、そこに入るデータが何通りかあり、関連して変わってくる項目があるような場合はアクセスが便利です。(エクセルのVLOOKUPを使いたいような場合です) 「次のような」とおっしゃる形であれば、 行事欄をあらかじめたくさん作っておかないと、ですね。
お礼
1フィールド1データは基本なんですね 何度もすみません。 もとのデータを並び替えるクエリをつくって、できました。 ありがとうございました。
補足
実は、Excelでほしいものをマクロで作ることはできました。 ただ、今回はaccessを使いたいのです。 元データは、Excelをインポートしています。 今後は、行事AとDの参加者とか、行事のタイムテーブルから学期ごとの参加状況、なども作っていきます。 さらに、途中で生徒が増減することもあります。(最大は1クラス3名です) このようないろいろなアウトプットや状況を考えるたことと、accessの勉強のため、accessで行いたいのです。 よろしくお願いします。
- tamiemon96
- ベストアンサー率49% (658/1341)
ワンポイントアドバイス このようなケースでは、委員名簿テーブルを一人づつにしないと応用が利かなくなりますね。 このケースでは、3つのテーブルをハイパーリンクで結ぶ価値はないと思いますよ。 委員名簿テーブルに 行事A、行事Bの欄を設けて、YES/NO型などにすれば済んでしまいますね。 委員名簿T ID クラス 氏名 行事A 行事B 1 1-1 ああ 2 1-1 いい 3 1-2 かか 4 1-2 きき 5 1-2 くく 6 1-3 ささ 7 1-4 たた 8 1-4 ちち 9 1-5 つつ
補足
ありがとうございます。 行事テーブルはこれからも違う行事のものが追加されるので、名簿テーブルと行事テーブルを別にもちたいのです。 やはり、名簿テーブルをクエリでひとりづつに並べ替えてから、という手順になるのでしょうか?
- 007MUKADE
- ベストアンサー率41% (286/694)
クエリー を使います。 使い方は・・・Help で勉強して下さい。 Access には クエリービルダー と言う便利な機能が付いてます。
補足
クエリを使おうとしているのですが、名簿テーブルの生徒名が複数のフィールドになっているのを、一つのフィールドと結合させる方法がわかりません。 一つのクエリで行うのは無理があるのでしょうか?
お礼
ありがとうございます! 理解に半日かかりましたが、自分のテーブルを元に、書き換えて、動作しました。 いずれ、VBAで・・と思っていましたので、 一気に勉強がすすみました。 ただ、フォームのボタンをクリックしたときに・・というのが、うまくいきませんでした。 単純にVBAからステップ実行してしまいました。 そこは、これからの課題です!