質問: 初投稿です。よろしくお願いいたします。 2つのテーブルをマッチングし、クロス表を作成する方法はネット上で多数見受けられたのですが、3つ以上のテーブルをマッチングする方法を見つけることが出来ませんでした。 以下、例になります。今後クラブが増えた場合の対策等は考えないものとします。 (ベンダー:Oracle) 【例】以下のstudent、affiliation、clubマスタの3つを元に、各生徒が各部活に所属している場合には'1'を、所属していない場合には'0'を表示する表(所属表)を作りたい。 生徒番号StudentId 生徒氏名StudentName 1 田中太郎 2 鈴木一郎 3 高橋花子 4 後藤良子 生徒番号StudentId クラブ番号ClubId 1 001 1 003 2 002 3 001 3 003 3 004 4 002 4 005 クラブ番号ClubId クラブ名ClubName 001 サッカー部 002 野球部 003 手芸部 004 茶道部 005 演劇部 <所属状況>生徒番号StudentId 生徒氏名StudentName サッカー部 野球部 手芸部 茶道部 演劇部 1 田中太郎 1 0 1 0 0 2 鈴木一郎 0 1 0 0 0 3 高橋花子 1 0 1 1 0 4 後藤良子 0 1 0 0 1 技術初心者につき、2テーブルのマッチングまでで行き詰ってしまいました(caseとinを用いたもの。参考:http://pgcafe.moo.jp/new/SQL/index.php)。 どなたかお力をお貸しください。初投稿のため、情報不足等ありましたらご指摘ください。よろしくお願いいたします。
回答: 3つ目のテーブルは必要ないですね ``` SELECT S.StudentId AS "生徒番号" ,S.StudentName AS "生徒氏名" ,MAX(CASE WHEN A.ClubId = '001' THEN 1 ELSE 0 END) AS "サッカー部" ,MAX(CASE WHEN A.ClubId = '002' THEN 1 ELSE 0 END) AS "野球部" ,MAX(CASE WHEN A.ClubId = '003' THEN 1 ELSE 0 END) AS "手芸部" ,MAX(CASE WHEN A.ClubId = '004' THEN 1 ELSE 0 END) AS "茶道部" ,MAX(CASE WHEN A.ClubId = '005' THEN 1 ELSE 0 END) AS "演劇部" FROM StudentMaster S LEFT JOIN AffiliationMaster A ON S.StudentId = A.StudentId GROUP BY S.StudentId ,S.StudentName ORDER BY S.StudentId ```