/////
Search
Duplicate

The Report

태그
JOIN
IF
한 번 더 체크

문제

You are given two tables: Students and GradesStudents contains three columns IDName and Marks.
Grades contains the following data:
Ketty gives Eve a task to generate a report containing three columns: NameGrade and MarkKetty doesn't want the NAMES of those students who received a grade lower than 8. The report must be in descending order by grade -- i.e. higher grades are entered first. If there is more than one student with the same grade (8-10) assigned to them, order those particular students by their name alphabetically. Finally, if the grade is lower than 8, use "NULL" as their name and list them by their grades in descending order. If there is more than one student with the same grade (1-7) assigned to them, order those particular students by their marks in ascending order.
Write a query to help Eve.

예시

Sample Input
Sample Output
Maria 10 99 Jane 9 81 Julia 9 88 Scarlet 8 78 NULL 7 63 NULL 7 68
Plain Text
복사

정답

SELECT IF(Grade <8, NULL, Name), Grade, Marks FROM STUDENTS JOIN GRADES WHERE Marks BETWEEN Min_Mark AND Max_Mark ORDER BY Grade DESC, Name ;
SQL
복사

풀이

NON EQUI JOIN 방법과 IF() 함수 사용법을 묻는 문제이다.
NON EQUI JOIN을 사용하기 위해서는 FROM 절에서 JOIN으로 묶은 다음 WHERE 절에서 기준이 되는 컬럼들을 ‘=’가 아닌 다른 연산자들(BETWEEN, >, < 등)을 사용하여 조건을 표시하면 된다.
여기서는 STUDENTS 테이블에서는 Marks를 기준으로, GRADES 테이블에서는 Min_Mark와 Max_Mark를 기준으로 JOIN을 수행하기 때문에 다음과 같이 JOIN 한다.
FROM STUDENTS JOIN GRADES WHERE Marks BETWEEN Min_Mark AND Max_Mark
SQL
복사
이때 Grade를 기준으로 내림차순 정렬하고 이름을 기준으로 오름차순 정렬한 뒤 Name, Grade, Marks를 조회하면 다음과 같다.
그런데 8 이하의 GRADE를 받은 사람들은 이름을 NULL 처리 해주어야 한다.
이를 위해 SELECT 절에서 IF() 함수를 사용하여 Grade가 8 미만이면 NULL을, 이상이면 Name을 출력하도록 한다.
SELECT IF(Grade <8, NULL, Name), Grade, Marks
SQL
복사