[해커랭크 medium] The Report(join on between)(MySQL)
https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true
The Report | HackerRank
Write a query to generate a report containing three columns: Name, Grade and Mark.
www.hackerrank.com
이 문제의 특이한 점은 조인할 때 on의 방식이 약간 다르다는 것!
select (case when g.grade < 8 then null else s.name end), g.grade, s.marks
from students s
join grades g
on s.marks between g.min_mark and g.max_mark
order by g.grade desc, s.name, s.marks
Students 테이블에서 학생들의 점수(Marks)가 Grade 테이블에서 어떤 Grade에 속해있는지 알아야 한다.
따라서, Students 테이블의 Marks가 Grade 테이블의 Min_Mark와 Max_Mark 사이에 있는 행을 찾아 Grade를 알 수 있다. 예를 들어, Marks가 85점이라면 85점은 Grade 테이블에서 80점과 89점 사이에 있으므로 Grade는 9가 된다.
그리고 order by 순서는
1) 제일 먼저 grade 기준으로 내림차순
2) grade가 같은 게 있다면 이름 알파벳 기준으로 오름차순
3) grade와 이름까지 같다면 marks 기준으로 오름차순
=> 사실 이름이 같은 사람은 없지만 grade가 8 미만인 학생들의 이름은 null로 표시하라고 했으므로 결국 얘네들은 이름이 null로 같은 것이 된다. 근데 문제에서 이름이 null인 애들 중에서 grade가 같다면 marks 기준으로 오름차순을 하라고 했으므로 order by 제일 마지막에 s.marks를 추가해준다. (사실 굳이 정렬을 안해도 이 문제에서는 디폴트로 marks 기준 오름차순으로 나오기 때문에 안해도 상관은 없다.)