개발은 처음이라 개발새발

JOIN구문에 들어가는 BETWEEN [해커랭크] 본문

mysql

JOIN구문에 들어가는 BETWEEN [해커랭크]

leon_choi 2023. 6. 25. 18:18
반응형

https://www.hackerrank.com/challenges/the-report/problem?h_r=internal-search 

 

The Report | HackerRank

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

www.hackerrank.com

이번에는 join 구문에서 between절을 활용하는 퀴즈를 풀어보려고 합니다. 흔히 join 구문에서 두 테이블을 매칭 시킬 때 on을 적고 그안에 각각의 테이블에서 매칭 시킬 수 있는 컬럼을  "A.컬럼 = B.컬럼 " 이런식으로 적는게 기본인데요. 하지만 모든 상황과 테이블들이 이 같은 구문으로 해결될순 없겠죠. 그렇기에 하나의 구문에서 어떻게 여러 방법으로 쿼리를 적을 수 있는지 배워나가는 것도 중요합니다. 특히, join은 참 많이 사용하는 구문이기에 알아두면 유용할거라 생각합니다. 

 

문제를 살펴보면 grades, sutdents라는 테이블이 있습니다. 그리고 두 테이블을 살펴보면 1차적으로 매칭 시킬 수 있는 컬럼이 존재하지 않습니다. 그리고 여러 조건이 있는데요. 조건은 아래와 같습니다.

 

**조건**

1. grade가 같으면 이름 알파벳 오름차순으로 정렬

2. grade가 8보다 낮으면 이름은 NULL처리

3. grader가 8보다 낮은 marks 들은 marks 오름차순으로 정렬

 

위 조건들 중 2번을 보면 grade가 8보다 낮을 경우라는 조건이 붙기 때문에 이름은 CASE...WHEN...THEN 구문을 활용해야 합니다. 그렇다면 위 조건들을 적용한 쿼리를 확인해보겠습니다.

SELECT 
(CASE WHEN g.grade < 8 THEN NULL ELSE a.name END) AS name
, g.grade
, a.marks
FROM students AS a
JOIN grades AS g ON a.marks BETWEEN g.min_mark AND g.max_mark
ORDER BY g.grade DESC, name, a.marks
_____________________________________________________________________
output:
Britney 10 95
Heraldo 10 94
Julia 10 96
Kristeen 10 100
Stuart 10 99
Amina 9 89
Christene 9 88
Salma 9 81
Samantha 9 87
Scarlet 9 80
Vivek 9 84
Aamina 8 77
Belvet 8 78
Paige 8 74
Priya 8 76
Priyanka 8 77
NULL 7 64
NULL 7 66
NULL 6 55
NULL 4 34
NULL 3 24

쿼리를 보게 되면 students테이블에 있는 marks와 grade 테이블에 있는 min_mark, max_mark를 Between 구문을 가지고 매칭을 시켰습니다. 이름 조건 역시 case 구문을 활용해 grade가 8미만인 name은 null로 처리했습니다.

반응형