Milky's note

[HackerRank](M) The Report 본문

SQL/SQL 코딩 테스트-HackerRank

[HackerRank](M) The Report

밀뿌 2022. 3. 25. 23:35

https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen 

 

The Report | HackerRank

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

www.hackerrank.com

 

[문제]

You are given two tables: Students and Grades. Students 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 Output

Maria 10 99
Jane 9 81
Julia 9 88 
Scarlet 8 78
NULL 7 63
NULL 7 68


Note

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

 

 

[답]

- mysql

select if(g.grade<8,'NULL',s.name), g.grade, s.marks
from students s
inner join grades g
on s.marks between g.min_mark and g.max_mark
order by g.grade desc, s.name, s.marks

문제 푸는데 좀 헤맸다... 점수별로 case 문을 써야하나 했는데 inner join이 범위도 지정할 수 있다는 사실을 배웠다.

쿼리가 대박 짧아졌다.

그리고 성적이 8 미만인 학생들은 익명을 보장해주어야 해서 이름이 아닌 null로 출력되게 하여야한다.

조건을 추가하려고 if 를 사용했다. 맞으면 2번째 파라미터, 그렇지 않으면 3번째 파라미터 값을 출력한다.

정렬은 순서가 좀 복잡한데 일단 grade가 높은 학생부터 출력하고, grade가 같으면 알파벳순서이기 때문에 이름의 오름차순, 다음으로 다 같으면 marks가 낮은 순으로 정렬을 하는 것이 조건이다.

천천히 하나씩 읽으면 복잡하지는 않는데 inner join에서 범위 조절 다시 한번 공부해야겠다.

 

Comments