본문 바로가기

SQL/HackerRank (SQL문풀)

HackerRank / Basic Join / The Report / MySQL

728x90

📚문제

출처 : Hackerrank(https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true)

 

📝풀이

SELECT S.Name
     , G.Grade
     , S.Marks
FROM STUDENTS S
INNER JOIN Grades G ON S.Marks >= G.Min_mark AND S.Marks <= G.Max_mark
WHERE G.Grade >= 8
ORDER BY G.Grade DESC, S.NAME;

SELECT NULL
     , G.Grade
     , S.Marks
FROM STUDENTS S
INNER JOIN Grades G ON S.Marks >= G.Min_mark AND S.Marks <= G.Max_mark
WHERE G.Grade < 8
ORDER BY G.Grade DESC, S.Marks;

지금까지 배웠었던 내용으로는 풀지 못할 것 같아서 Leaderboard의 MySQL로 된 풀이를 참고했다

다행히 그렇게 어려운 함수나 내용은 아닌 것 같고

2가지가 포인트인 것 같다

 

1. 두 테이블을 JOIN할 때 Key

Student 테이블에는 Marks로 되어있고 

Grades 테이블에는 Min_mark와 Max_mark가 구간처럼 되어있는데

그럼 Key를 어떻게 설정해 줘야되는거지? 라는 의문이 들었다

답은 AND 조건을 사용해서 S.Marks가 범위에 속할 때의 Marks값과 Grade값을 표시한다

 

2. 두 쿼리를 이어서 작성

두 쿼리를 합치려면 당연히 UNION을 써야한다고 생각했는데

생각해보니까 위 쿼리와 아래 쿼리는

첫 열이 각각 달라서 UNION은 할 수 없다

그래서 풀이를 보니 그냥 두 쿼리를 따로 써줬다...

이렇게 작성하면 결과가 그냥 순차적으로 나열되서 정답 처리가 되나보다

 

다른 풀이는 없는지 나중에 데이터리안 질문채널에 질문해봐야겠다

 

+ 몇 달만에 다시 풀어봤는데

   CASE문을 사용하니 간단히 풀렸다 👏

SELECT CASE 
           WHEN g.Grade >= 8 THEN s.Name
           ELSE NULL
       END AS Name
     , g.Grade
     , s.Marks
FROM Students s
JOIN Grades g ON s.Marks >= g.Min_Mark AND s.Marks <= g.Max_mark
ORDER BY g.Grade DESC, s.Name

 

728x90