Mo!
(HackerRank) 해커랭크 SQL [The Report] Oracle 풀이 본문
SQL

(HackerRank) 해커랭크 SQL [The Report] Oracle 풀이

5사 2021. 12. 2.

문제 링크

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

케티는 이브에게 세 개의 열을 포함하는 보고서를 생성하는 작업을 준다 : 이름, 등급, 마크.
케티는 8점 이하의 점수를 받은 학생들의 이름을 원하지 않는다.
보고서는 등급별로 내림차순으로 작성되어야 합니다. 즉, 상위 등급이 먼저 입력됩니다.
동일한 등급(8-10)의 학생이 두 명 이상 있는 경우 해당 학생의 이름을 알파벳 순으로 정렬합니다.
마지막으로 등급이 8보다 낮으면 'NULL'을 이름으로 사용하고 등급별로 내림차순으로 나열한다.
같은 등급(1-7)의 학생이 두 명 이상 있는 경우 해당 학생의 점수를 오름차순으로 정렬합니다.

 

JOIN과 CASE문을 사용한 풀이

 

 

출력해야 할 칼럼은 name, grade, marks이다

name과 marks는 students 테이블에 속해있고, grade는 grades 테이블에 속해있다

이 칼럼들을 함께 출력하기 위해 JOIN이 필요하다

 

from students s join grades g

-- students 테이블과 grades 테이블을 조인하고 각 별칭을 s와 g로 준다

 

on s.marks between g.min_mark and g.max_mark

-- grades 테이블을 보면 각 등급별 최소 점수(min_mark) 칼럼과 최고 점수(max_mark) 칼럼이 있다는 것을 알 수 있다

-- 그렇다면 JOIN 조건을 학생들의 점수(marks)가 grades 테이블의 최소 점수와 최고 점수 사이에 있음을 조건으로 주면 된다

 

where s.marks > 8

-- 점수를 8점 이하로 받은 학생들의 이름을 제외시켜야 하기 때문에 where 절에 조건으로 준다

 

order by 2 desc, 1, 3

-- 보고서는 등급별로 내림차순(desc)되어야 하고, 동일한 등급(8-10)의 학생이 두 명 이상일 경우 학생 이름을 알파벳 순으로 정렬하고, 동일한 등급(1-7)의 학생이 두 명 이상일 경우 점수를 오름차순으로 정렬한다.

 

case when g.grade < 8 then null else s.name end

-- 등급이 8보다 낮으면 이름을 null로 출력되게 한다

 

 

Comments