본문 바로가기
데이터/SQL 문제풀이

HackerRank SQL - The Report

by 찌노오 2023. 1. 18.

 

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 Input

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.

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)

 

Problem

등급테이블에서 등급 범위를 기준으로 학생테이블의 점수를 분류하고, 등급 기준으로 8등급 미만은 NULL 표기하되 내림차순, 다음 이름과 점수는 오름차순으로 정렬하라.


Answer1

SELECT if(G.grade < 8, NULL, S.name), G.grade, S.marks
FROM GRADES G, STUDENTS S
WHERE S.marks BETWEEN G.Min_Mark and G.Max_Mark
ORDER BY G.grade desc, S.name, S.marks asc

조건이 조금 많아서 하나씩 보면 다음과 같다.

비등가 조인으로 두 테이블을 결합하고, 8등급 미만은 이름 대신 NULL로 대치하고, 마지막으로 정렬은 등급 기준 내림차순, 이름과 점수 기준으로 오름차순으로 정렬한다.

 

 


How to solve

 

# GRADES table이 기준 테이블, STUDENTS가 값 테이블이라고 보면 아래와 같이 표현할 수 있다.
FROM GRADES G, STUDENTS S
WHERE S.marks BETWEEN G.Min_Mark and G.Max_Mark

 

요 문제는 엑셀에서 작업할 때는 많이 마주치는 상황이긴 하다.

어떤 범위가 주어지는 기준 테이블이 있고 그 테이블 값을 매칭시키는 방식인데, 엑셀에서는 중첩IF문을 쓰거나, vlookup을 써서 해결하면 된다.

 

그런데 MySQL로 넘어오니까 알 것 같은데 쿼리를 짜는게 막혔다.

JOIN 중에서도 잘 안쓰는 NON-EQUL JOIN(비등가 조인)을 이용하면 되는데 이번 기회에 찾아보게 되었다.

사실 별 거 없고, WHERE절에 between이나 >, < 같은 부등호를 넣어주면 된다.

 

 

 

 

반응형

댓글