SQL/SQL 문제

[SQL] HackerRank - The Report(M)

dori_0 2022. 6. 1. 15:43

  The Report  

 

The Report | HackerRank

Write a query to generate a report containing three columns: Name, Grade and Mark.

www.hackerrank.com

 


# Problem

You are given two tables: Students and GradesStudents contains three columns ID, Name and Marks.

 

 

Grades contains the following data:

Ketty gives Eve a task to generate a report containing three columns: Name, Grade and Mark. Ketty doesn't want the NAMES of those students who received a grade lower than 8. The report must be in descending order by grade -- i.e. higher grades are entered first. If there is more than one student with the same grade (8-10) assigned to them, order those particular students by their name alphabetically. Finally, if the grade is lower than 8, use "NULL" as their name and list them by their grades in descending order. If there is more than one student with the same grade (1-7) assigned to them, order those particular students by their marks in ascending order.

Write a query to help Eve.

 

Sample Input

Sample Output

Note

Print "NULL"  as the name if the grade is less than 8.

 

Explanation

Consider the following table with the grades assigned to the students:

So, the following students got 8, 9 or 10 grades:

* Maria (grade 10)

* Jane (grade 9)

* Julia (grade 9)

* Scarlet (grade 8)

 


# Answer

1) grade를 기준으로 내림차순 하기
2) 같은 grade의 학생이 있다면, 학생의 이름순으로 정렬하기
3) grade가 8 미만인 학생들의 이름은 "NULL"로 출력하고 grade 순으로 내림차순 하기
4) grade가 8 미만인 학생들 중 같은 grade인 학생이 2명 이상이라면 marks 순으로 오름차순 하기

 

 

먼저, 두 테이블을 JOIN 해주어야 한다.

Students 테이블의 Garks 값이 grades 테이블의 Min_mark, Max_mark 사이에 있어야 하므로

SELECT *
  FROM students AS s
 INNER JOIN grades AS g 
         ON s.marks BETWEEN g.min_mark AND g.max_mark

다음과 같이 BETWEEN을 사용하여 JOIN 할 수 있다.

 

 

정렬 조건을 보면 1. grade 내림차순  2. 학생의 이름순  3. mark 오름차순 이므로 ORDER BY에 조건을 추가해주자

SELECT *
  FROM students AS s
 INNER JOIN grades AS g 
         ON s.marks BETWEEN g.min_mark AND g.max_mark
 ORDER BY g.grade DESC, s.name, s.marks;

 

 

마지막으로 grade가 8 미만인 학생의 이름은 "NULL"로 출력해야한다.

IF절을 사용하여 marks가 69이하이면 NULL 그렇지 않으면 이름을 출력하도록 적어주었다.

그 뒤로는 grade, marks를 출력해주었다.

 

[ 최종 답 ]

SELECT IF(s.marks <= 69, NULL, s.name)
     , g.grade
     , s.marks
  FROM students AS s
 INNER JOIN grades AS g 
         ON s.marks BETWEEN g.min_mark AND g.max_mark
 ORDER BY g.grade DESC, s.name, s.marks;