https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true
코드설명
INNER JOIN + BETWEEN + CASE WHEN + SORT 를 활용합니다.
문제에서 새롭게 알게된점은, CASE WHEN 을 활용해서 ORDER BY 절에서도 GRADE가 8 이상이냐, 8 미만이냐에 따라 정렬조건을 다르게 설정할 수 있다는 점입니다.
CASE WHEN 으로 어디서든 조건문 처럼 문자열을 다룰 수 있다는 점에서 상당히 인상깊었습니다.
만약, 이러한 쿼리가 불가능했다면 단순히 UNION 연산을 사용해서 불필요한 연산이 추가되었겠지요.
그리고, 처음에 MIN_MAR와 MAX_MARK를 BETWEEN 값으로 해도되지만,
아래와 같이 10의 범위로 짜른뒤에 버림을 처리하려했지만, 올바르지 않다고 나옵니다..
ON ROUND(((S.MARKS/10) + 1 - 0.5), 0) = G.GRADE
ON FLOOR(S.MARKS/10) + 1 = G.GRADE
사실, 정확히 어떤 엣지케이스가 존재하는지 모르겠습니다.
그 대신에 훨씬 더 간단하게 문제에서 주어진 최소, 최대 MARK에 맞추어서 처리하면 됩니다.
ON S.MARKS BETWEEN G.MIN_MARK AND G.MAX_MARK
ORACLE 코드
정답코드1입니다.
SELECT
CASE
WHEN G.GRADE < 8 THEN 'NULL'
ELSE S.NAME
END AS 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,
CASE
WHEN G.GRADE >= 8 THEN S.NAME
ELSE NULL
END ASC,
CASE
WHEN G.GRADE < 8 THEN S.MARKS
ELSE NULL
END ASC;