https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true

 

The Report | HackerRank

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

www.hackerrank.com

코드설명

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;

+ Recent posts