https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true
1. 기본 골자 만들어주기
WITH sub AS (
SELECT s.name,
g.grade,
s.marks
FROM students s
INNER JOIN grades g ON s.marks BETWEEN g.min_mark AND g.max_mark)
-- s.marks가 min_mark와 max_mark 사이에 있는 경우에 대해 JOIN
이 테이블을 활용해야 하므로 WITH절 서브쿼리 형태로 빼내줌
2. grade에 따라 name 출력이 달라지므로 CASE문을 이용해서 조건에 따라 name이 다르게 출력되도록 설정
SELECT CASE WHEN grade >= 8 THEN name ELSE NULL END AS name,
grade,
marks
FROM sub
3. ORDER BY 조건을 적용
grade 8 이상인 경우 grade DESC, name
grade 8 미만인 경우 grade DESC, mark 인데
ORDER BY grade DESC, name, marks
이렇게 작성하면 됨
grade 8 미만인 경우 name이 어짜피 NULL이기 때문에 !
WITH sub AS (
SELECT s.name,
g.grade,
s.marks
FROM students s
LEFT JOIN grades g ON s.marks BETWEEN g.min_mark AND g.max_mark)
SELECT CASE WHEN grade >= 8 THEN name ELSE NULL END AS name,
grade,
marks
FROM sub
ORDER BY grade DESC, name, marks
사실 ! 굳이 서브쿼리를 사용하지 않고도 풀 수 있던 문제였다.
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, name, marks
1. INNER JOIN ON 조건에 BETWEEN 사용 가능
2. CASE문을 이용해서 특정 조건일 때 NULL 집어넣을 수 있음
3. 정렬기준 여러개일때 순서 고려해주기
'SQL > 문제풀이' 카테고리의 다른 글
[HackerRank] Conest Leaderboard (0) | 2024.05.10 |
---|---|
[HackerRank] Interviews (0) | 2024.05.09 |
[HackerRank] Challenges 📌 (0) | 2024.05.09 |
[HackerRank] Top Earners / N가지 풀이 (0) | 2024.05.08 |
[Leetcode] Department top three salaries (0) | 2024.05.08 |