質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1382閲覧

【SQL】複数テーブル(3つ以上)同士のマッチングをCASE式を用いて行いたい

citrus1102

総合スコア6

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/01/19 18:10

編集2018/01/19 18:33

初投稿です。よろしくお願いいたします。

2つのテーブルをマッチングし、クロス表を作成する方法はネット上で多数見受けられたのですが、3つ以上のテーブルをマッチングする方法を見つけることが出来ませんでした。
以下、例になります。今後クラブが増えた場合の対策等は考えないものとします。
(ベンダー:Oracle)

【例】以下のstudent、affiliation、clubマスタの3つを元に、各生徒が各部活に所属している場合には'1'を、所属していない場合には'0'を表示する表(所属表)を作りたい。

<studentマスタ:StudentMaster >
生徒番号StudentId 生徒氏名StudentName
1         田中太郎
2         鈴木一郎
3         高橋花子
4         後藤良子

<affiliationマスタ:AffiliationMaster>
生徒番号StudentId クラブ番号ClubId
1           001
1           003
2           002
3           001
3           003
3           004
4           002
4           005

<clubマスタ:ClubMaster>
クラブ番号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)。
どなたかお力をお貸しください。初投稿のため、情報不足等ありましたらご指摘ください。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/19 18:22

SQLでは曖昧なので、ベンダーを明記してください。
citrus1102

2018/01/19 18:25

コメントありがとうございます。Oracleです。
退会済みユーザー

退会済みユーザー

2018/01/19 18:30

ここは質問への修正の依頼です。質問文を修正して、多くの回答者の目につくようにしてください。
citrus1102

2018/01/19 18:32

システムがよく分かっておらず申し訳ありません。すぐに修正します。ありがとうございます。
guest

回答2

0

oracle 11g以降ならクロス集計にはpivotが使用できます。
ピボットの使い方
試していませんが、以下のような記述になるかと思います。

SQL

1select * from ( 2 select t1.studentid, studentname, ClubName, ClubId 3 from studentmaster t1 left join affiliationmaster t2 4 on t1.studentid = t2.studentid 5 pivot (count(ClubId) for ClubName 6 in ('サッカー部','野球部','手芸部','茶道部','演劇部') 7) 8order by studentid

投稿2018/01/20 16:58

編集2018/01/20 17:02
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

citrus1102

2018/01/21 13:35

ご回答ありがとうございます!pivotはこれまで使ったことがなかったので、勉強になりました。 しかし、今回実際に用いているテーブル、そして出したいデータの都合から、はじめの回答をベストアンサーに選ばせていただきたいと思います。 pivotについても、今後のために演習を行いたいと思います。ありがとうございました。
guest

0

ベストアンサー

3つ目のテーブルは必要ないですね

SQL

1SELECT 2 S.StudentId AS "生徒番号" 3 ,S.StudentName AS "生徒氏名" 4 ,MAX(CASE WHEN A.ClubId = '001' THEN 1 ELSE 0 END) AS "サッカー部" 5 ,MAX(CASE WHEN A.ClubId = '002' THEN 1 ELSE 0 END) AS "野球部" 6 ,MAX(CASE WHEN A.ClubId = '003' THEN 1 ELSE 0 END) AS "手芸部" 7 ,MAX(CASE WHEN A.ClubId = '004' THEN 1 ELSE 0 END) AS "茶道部" 8 ,MAX(CASE WHEN A.ClubId = '005' THEN 1 ELSE 0 END) AS "演劇部" 9FROM 10 StudentMaster S LEFT JOIN AffiliationMaster A ON 11 S.StudentId = A.StudentId 12GROUP BY 13 S.StudentId 14 ,S.StudentName 15ORDER BY 16 S.StudentId

投稿2018/01/19 20:15

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

citrus1102

2018/01/20 01:58

なるほど!maxを用いるんですね!!昨夜ギリギリまで色々試して寝てしまったのですが、結合も上手くいっていなかったようです(他の皆さんの投稿を見ると、途中経過のコードも載せているようなので、次回から見習いたいと思います)。 質問用の例としてあげたテーブルなので、実際のテーブルでも試したいと思います。 解決し次第、ベストアンサーに選ばせていただきます。ありがとうございました。
citrus1102

2018/01/21 13:36

実際のテーブルで試した結果、出したい通りにデータを抜き出せました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問