
Access勉強中です。
委員名簿テーブルと、いくつかの行事テーブルを結合したいのですが、上手くいきません。
どうか教えてください。
access2003です。
委員名簿テーブル
クラス 生徒名1 生徒名2 生徒名3
1-1 ああ いい
1-2 かか きき くく
1-3 ささ
1-4 たた ちち つつ
行事Aテーブル 行事Bテーブル
生徒名 参加 生徒名 参加
かか true ああ false
ささ true いい true
ちち false きき true
たた true
ちち true
このようなテーブルを結合して、次のようなテーブルを作りたいのです。
クラス 生徒名 行事A 行事B
1-1 ああ false
1-1 いい true
1-2 かか true
1-2 きき true
1-2 くく
1-3 ささ true
1-4 たた true
1-4 ちち false true
1-5 つつ
よろしくお願いします。
No.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テーブル」に結合線が向かっている
ことに注目してください。行事テーブルが追加されるような場合は
結合線の設定を同じようにしてください。
以上です。
わからないところがあれば補足してください。
ありがとうございます!
理解に半日かかりましたが、自分のテーブルを元に、書き換えて、動作しました。
いずれ、VBAで・・と思っていましたので、
一気に勉強がすすみました。
ただ、フォームのボタンをクリックしたときに・・というのが、うまくいきませんでした。
単純にVBAからステップ実行してしまいました。
そこは、これからの課題です!
No.4
- 回答日時:
現状のテーブル設計だと行事が増えるごとに、クラスの入れ替えや増減があるごとに
クエリを修正しなくてはなりません。
また、そのクエリ自体が難しくはなくとも長い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での並び替えの方法を載せてくださった方がいたので、
今回は、そちらの方に、ポイントをつけました。
基本を叩き込むことができました。
ありがとうございました。
No.3
- 回答日時:
No.2です。
アクセスで、データ同士をリンクさせるなら、1フィールド、1データにしないと、です。
ただ、質問者様のイメージされるフォームは、
生徒1名に対して、各行事答えが1つづつのため
エクセルに向いている内容に思えます。
例えば、行事欄が1つで、そこに入るデータが何通りかあり、関連して変わってくる項目があるような場合はアクセスが便利です。(エクセルのVLOOKUPを使いたいような場合です)
「次のような」とおっしゃる形であれば、
行事欄をあらかじめたくさん作っておかないと、ですね。
この回答への補足
実は、Excelでほしいものをマクロで作ることはできました。
ただ、今回はaccessを使いたいのです。
元データは、Excelをインポートしています。
今後は、行事AとDの参加者とか、行事のタイムテーブルから学期ごとの参加状況、なども作っていきます。
さらに、途中で生徒が増減することもあります。(最大は1クラス3名です)
このようないろいろなアウトプットや状況を考えるたことと、accessの勉強のため、accessで行いたいのです。
よろしくお願いします。
1フィールド1データは基本なんですね
何度もすみません。
もとのデータを並び替えるクエリをつくって、できました。
ありがとうございました。
No.2
- 回答日時:
ワンポイントアドバイス
このようなケースでは、委員名簿テーブルを一人づつにしないと応用が利かなくなりますね。
このケースでは、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 つつ
この回答への補足
ありがとうございます。
行事テーブルはこれからも違う行事のものが追加されるので、名簿テーブルと行事テーブルを別にもちたいのです。
やはり、名簿テーブルをクエリでひとりづつに並べ替えてから、という手順になるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
教えて!gooグレードポイントがdポイントに変わります!
dアカウント連携を行っていただくと、グレードに応じて「dポイント」が進呈されるようになります。
-
Accessのフィールド結合について
Access(アクセス)
-
ACCESSでひとつのフィールドに内容をまとめる
Access(アクセス)
-
Accessのクエリで2つのフィールドが同条件の場合に結合したい
その他(Microsoft Office)
-
4
アクセスで複数のレコード情報を1レコードにまとめる方法
Access(アクセス)
-
5
アクセス2003 複数の列に分かれたデータを1列にまとめたい
Access(アクセス)
-
6
Access2003 クエリで、空の列は作れますか?
Access(アクセス)
-
7
複数のレコードを1つのレコードにまとめる方法
Access(アクセス)
-
8
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
9
ACCESS 一つのフィールドに複数レコードの値をセットしたい
その他(データベース)
-
10
ACCESS クエリで重複データを最新の1件だけ表示
Access(アクセス)
-
11
アクセス:SQLでフィールドの結合できますか
Access(アクセス)
-
12
Accessでグループ化した結果フィールドをつなげるには?
その他(Microsoft Office)
-
13
アクセス 同じフィールド(テキスト型)のレコードを連結させたい
Access(アクセス)
-
14
アクセスで追加した項目に全て同じ値を一発で入れたい
Access(アクセス)
-
15
Access サブフォームでの選択行の取得
その他(データベース)
-
16
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
17
Access 同じデータをたくさんのレコード(同一列)に一度に入力するには
Access(アクセス)
-
18
[Access]異なるレコード間の文字列連結
その他(データベース)
-
19
Accessでデータシートに同じデータがいくつもでてしまいます。
その他(データベース)
-
20
ACCESS 「パラメータの入力」を消したい!!
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
誕生日を忘れられた友達との今...
-
5
町内会の清掃に出れない時の対...
-
6
【至急】 卒業式当日に喧嘩して...
-
7
写真見てほしいです!
-
8
後援会費って払わなくてもOK?
-
9
同窓会がこれから先あるかもし...
-
10
結婚式の招待状の返信はがきに...
-
11
誕生日プレゼントをお返ししな...
-
12
週2日のパートを始めたのですが
-
13
アパートの隣の部屋のポストに...
-
14
今日、郵便受けに匿名で手紙が...
-
15
交通安全協力会 協力金1500円...
-
16
免許更新の誕生日1ヶ月前とは?
-
17
エクセルのシートリンクで,色...
-
18
Happy 20th Birth Day! 使い方...
-
19
亡くなった人の名前を宛名に書...
-
20
聞いてください…今日誕生日なん...
おすすめ情報
公式facebook
公式twitter