本日もCASE式です。
下記のようなテーブル(studentclub)があるとします。
std_id | club_id | club_name | main_club_flg
——–+———+————–+—————
100 | 1 | 野球 | Y
100 | 2 | 吹奏楽 | N
200 | 2 | 吹奏楽 | N
200 | 3 | バドミントン | Y
200 | 4 | サッカー | N
300 | 4 | サッカー | N
400 | 5 | 水泳 | N
500 | 6 | 囲碁 | N
ここで下記のような実行を行います。
- ここで1つのクラブに所属している学生はクラブIDを取得
- 複数のクラブに入っている場合はmain_club_flgが立っているクラブIDを取得
第一ステップ
std_id,と列数を出す
1 |
SELECT std_id, COUNT(*) FROM studentclub GROUP BY std_id |
これをベースに肉付けしていきます。
第二ステップ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SELECT std_id, CASE WHEN COUNT(*) = 1 THEN --1個だけ出したいときもMAXは使える MAX(club_id) ELSE --ここはCOUNT(*)が当然複数 ( MAX( --main_club_flg=1だったらclub_idを出すというのをGROUP BYされた中でもかける CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END ) ) END AS main_club FROM studentclub GROUP BY std_id ORDER BY std_id ASC |
std_id | main_club
——–+———–
100 | 1
200 | 3
300 | 4
400 | 5
500 | 6
このように集計関数のなかで書くとGROUP BYされたなかで条件分岐をさせることができます。