非正規化されたテーブルの場合
例えば、以下のように科目ごとにテストの結果を複数持つpractice_test_score_tableテーブルが存在するとします。
このテーブルから、scoer_1~3のうち最も点数が高いものをmax_scoreとし、それぞれの生徒ごとに表示するとします。
その場合は、以下のようにSelect文内でCase文を使って出しわけることができます。
SQL
select id, student_name, case when score_1 >= score_2 and score_1 >= score_3 then score_1 when score_2 >= score_3 then score_2 else score_3 end as max_score from practice_test_score_table;
正規化されている場合
上記の例は説明の簡略化のために非正規化されたテーブルを使いましたが、普通は以下のように正規化されたテーブルが使われるかと思います。
・生徒マスタ
・点数明細
・結合ビュー
このようなエンティティ構造において、それぞれの生徒の最高得点を求めます。
SQL
select s_mst.id, s_mst.student_name, max_score from practice2_student_mst s_mst inner join (select sc.student_id, max(sc.score) as max_score from practice2_score sc group by sc.student_id) as sc on s_mst.id = sc.student_id order by id;