Ketty는 이브에게 이름, 학년, 마크의 세 가지 열로 된 보고서를 작성하도록 과제를 준다. Ketty는 8보다 낮은 등급을 받은 학생의 이름을 원하지 않는다. 보고서는 학년별로 내림차순이어야 하며, 같은 등급(8-10)을 받은 학생이 둘 이상일 경우 해당 학생의 이름을 알파벳 순서로 정렬하시오. 마지막으로, 등급이 8보다 낮을 경우, "NULL"을 이름으로 사용하고 등급별로 내림차순으로 나열하시오. 같은 등급(1-7)을 받은 학생이 둘 이상일 경우, 해당 학생의 이름을 오름차순으로 정렬하시오.
WITH SAMPLE AS(
SELECT
CASE
when Marks<=9 then 1
when Marks<=19 then 2
when Marks<=29 then 3
when Marks<=39 then 4
when Marks<=49 then 5
when Marks<=59 then 6
when Marks<=69 then 7
when Marks<=79 then 8
when Marks<=89 then 9
when Marks<=100 then 10
end as GRADE,
NAME, MARKS
FROM STUDENTS)
SELECT CASE
WHEN GRADE >=8 THEN NAME
ELSE 'NULL'
END AS NAME, GRADE, MARKS
FROM SAMPLE
ORDER BY GRADE DESC, NAME
CTE와 Case when을 사용해서 문제를 풀었지만, 해당 챕터는 Join을 활용한 Solution을 제시해야한다. 문제를 풀고 난 후 Leaderboard를 참조하여 다른 방법으로 문제를 풀어보았다.
select case
when grade >= 8 then Name
else 'NULL'
end, Grade, Marks
from Students join Grades
where Students.Marks between Grades.Min_Mark and Grades.Max_Mark
order by Grade desc, Name
join 조건으로 Between을 사용해서 Grade를 지정하면 보다 편리하고 효율적으로 쿼리를 작성할 수 있다. 그런데, case when 문의 뒤에 별칭(alias)을 지정하고, 해당 별칭으로 order by를 사용하면 오류가 발생한다. SQL에서 별칭을 사용할 수 없는 경우는 다음과 같다.
- Where절
- 같은 Select절
- Update
- Group by절
order by에서는 Alias를 사용할 수 있음에도, 안되는 이유는 찾지 못했다. 다만, CASE문의 결과에 Alias를 지정하지 않으면 해당 결과는 일반적으로 익명의 열로 취급된다는건 확인했다. 이러한 경우, 익명의 열은 select 절에 있는 순서대로 참조된다. 그러나 order by절에서 Name을 참조하면, 원래 Students 테이블의 Name 열을 참조하는 것으로 해석될 수 있다. 즉, Case문의 결과가 아닌 원래의 Name 열이 정렬에 사용되는 것이다.
The Report | HackerRank
Write a query to generate a report containing three columns: Name, Grade and Mark.
www.hackerrank.com
'코딩 테스트 > SQL' 카테고리의 다른 글
| [MySQL] 프로그래머스 - 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2024.06.25 |
|---|---|
| [MySQL] - Placements (0) | 2024.02.08 |
| [MySQL] HackerRank - Weather Observation Station 20 (2) | 2024.01.16 |
| [MySQL] HackerRank - The PADS (0) | 2024.01.16 |
| [MySQL] HackerRank - Weather Observation Station 5 (2) | 2024.01.14 |