BBH
-Biz Branding Hub-
投稿日 : 
2019/11/27
更新日 : 
2019/11/27

【SQL】複数の値を比較して最大値を表示する(正規化、非正規化両パターン)

非正規化されたテーブルの場合

例えば、以下のように科目ごとにテストの結果を複数持つ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;

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend