プロが教えるわが家の防犯対策術!

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   つつ

よろしくお願いします。

教えて!goo グレード

A 回答 (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テーブル」に結合線が向かっている
ことに注目してください。行事テーブルが追加されるような場合は
結合線の設定を同じようにしてください。

以上です。
わからないところがあれば補足してください。
    • good
    • 0
この回答へのお礼

ありがとうございます!

理解に半日かかりましたが、自分のテーブルを元に、書き換えて、動作しました。
いずれ、VBAで・・と思っていましたので、
一気に勉強がすすみました。

ただ、フォームのボタンをクリックしたときに・・というのが、うまくいきませんでした。
単純にVBAからステップ実行してしまいました。

そこは、これからの課題です!

お礼日時:2012/09/08 11:54

現状のテーブル設計だと行事が増えるごとに、クラスの入れ替えや増減があるごとに


クエリを修正しなくてはなりません。
また、そのクエリ自体が難しくはなくとも長い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を元にしてクロス集計クエリで最終的なモノが得られます。
    • good
    • 0
この回答へのお礼

同姓同名は、考えていませんでした・・・
やはり1意のテーブル構造にすることが基本ですね。

ご指摘のように、並び替える複数のクエリを作って、
クロス集計クエリでできました。

お礼をつける前に、VBAでの並び替えの方法を載せてくださった方がいたので、
今回は、そちらの方に、ポイントをつけました。

基本を叩き込むことができました。
ありがとうございました。

お礼日時:2012/09/08 12:02

No.2です。



アクセスで、データ同士をリンクさせるなら、1フィールド、1データにしないと、です。

ただ、質問者様のイメージされるフォームは、

生徒1名に対して、各行事答えが1つづつのため
エクセルに向いている内容に思えます。

例えば、行事欄が1つで、そこに入るデータが何通りかあり、関連して変わってくる項目があるような場合はアクセスが便利です。(エクセルのVLOOKUPを使いたいような場合です)

「次のような」とおっしゃる形であれば、
行事欄をあらかじめたくさん作っておかないと、ですね。

この回答への補足

実は、Excelでほしいものをマクロで作ることはできました。

ただ、今回はaccessを使いたいのです。

元データは、Excelをインポートしています。
今後は、行事AとDの参加者とか、行事のタイムテーブルから学期ごとの参加状況、なども作っていきます。
さらに、途中で生徒が増減することもあります。(最大は1クラス3名です)

このようないろいろなアウトプットや状況を考えるたことと、accessの勉強のため、accessで行いたいのです。

よろしくお願いします。

補足日時:2012/09/05 08:05
    • good
    • 0
この回答へのお礼

1フィールド1データは基本なんですね

何度もすみません。

もとのデータを並び替えるクエリをつくって、できました。
ありがとうございました。

お礼日時:2012/09/08 11:48

ワンポイントアドバイス



このようなケースでは、委員名簿テーブルを一人づつにしないと応用が利かなくなりますね。

このケースでは、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   つつ

この回答への補足

ありがとうございます。
行事テーブルはこれからも違う行事のものが追加されるので、名簿テーブルと行事テーブルを別にもちたいのです。

やはり、名簿テーブルをクエリでひとりづつに並べ替えてから、という手順になるのでしょうか?

補足日時:2012/09/04 21:00
    • good
    • 0

クエリー を使います。



使い方は・・・Help で勉強して下さい。
 Access には クエリービルダー と言う便利な機能が付いてます。

この回答への補足

クエリを使おうとしているのですが、名簿テーブルの生徒名が複数のフィールドになっているのを、一つのフィールドと結合させる方法がわかりません。

一つのクエリで行うのは無理があるのでしょうか?

補足日時:2012/09/04 21:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング