[HackerRank] The Report Solution

sunjoo·2020년 9월 8일
0

SQL

목록 보기
3/5

📌HackerRank 'The Report'


💻 의사코드 이용 문제 정리

print name, grade, mark
if grade<8 then name= NULL order by marks desc
if COUNT(grade<8)>1 order by grade asc
order by grade desc, name

🎈 문제풀이 전 헷갈렸던 점

1) Grade는 mark의 범위로 정해진다. students table에는 student name, mark만 있고 grades table에는 mark와 grade가 있어 둘이 join해야 한다는 점은 알았지만, 범위를 사용해서 join을 해본 경험이 없어 당황했다.

2) grade의 descending order로 정렬해달라고 했는데 grade<8인 학생들은 marks ascending order로 정리해달라고 하다니 또 당황했다.

📝 쿼리

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, s.name, s.marks

모든 SQL문에는 순서가 있다는 것이 기본인데 자꾸 깜빡한다!
ORDER BY는 왼쪽부터 순차적으로 실행된다.
(1) 모든 학생들은 grade 내림차순으로 정렬된다
(2) grade가 같은 학생들은 이름 오름차순으로 정렬된다
(3) 이 때 grade<8인 학생들은 이름이 NULL로 통일되어 있으므로, 그들은 mark 오름차순으로 정렬된다.

profile
Future Data Analyst

0개의 댓글