Prepare > SQL > Basic Join > The Report
The Report | HackerRank
Write a query to generate a report containing three columns: Name, Grade and Mark.
www.hackerrank.com
문제
Ketty gives Eve a task to generate a report containing three columns: Name, Grade and Mark. Ketty 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.
=> 케티는 STUDENT와 GRADE테이블에서 Name, Grade, Mark를 원한다. Grade기준으로 정렬하되 Grade가 같다면 이름 알파벳 순, Grade가 8 보다 작다면 이름을 NULL로 표시하고, Marks를 기준으로 오름차순 정렬해 쿼리하라.
코드
SELECT
IF(G.Grade >= 8, S.Name, NULL),
G.Grade,
S.Marks
FROM STUDENTS AS S
LEFT OUTER JOIN GRADES AS G
ON S.Marks >= Min_Mark AND S.Marks <= Max_Mark # ON BETWEEN Min_Mark AND Max_Mark
ORDER BY G.Grade DESC, S.Name ASC, S.Marks ASC;
- ORDER BY 는 콤마(,)로 복수의 기준 설정
노트
CASE WHEN THEN END 이용
SELECT CASE WHEN G.grade >= 8 THEN S.name ELSE NULL END,
G.Grade, S.Marks
FROM STUDENTS AS S
LEFT JOIN GRADES AS G ON S.Marks >= G.Min_Mark and S.Marks <= G.Max_Mark
ORDER BY G.Grade DESC, S.Name;
JOIN
- 언제나 1: n 관계를 유의
- INNER JOIN(내부 조인): 두 테이블에 모두 지정한 열의 데이터가 있어야 함
SELECT [조회할 컬럼]
FROM [A테이블]
INNER JOIN [B테이블] ON [조인할 조건]
- OUTER JOIN(외부 조인): 1개의 테이블에만 데이터가 있어도 결과가 나옴
SELECT [컬럼]
FROM [LEFT테이블]
[LEFT or RIGHT or FULL] OUTER JOIN [RIGHT테이블]
ON [조인할 조건]
- CROSS JOIN(상호 조인): 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인. 1 : n 조인임을 주의. (A 테이블의 행 수) X (B 테이블의 행 수) = (결과 테이블의 행 수)
SELECT [조회할 컬럼]
FROM [A테이블]
CROSS JOIN [B테이블]
SELF JOIN(자체 조인): 자기 자신을 조인함. 특정 문법이 있는 것은 아님.
SELECT [조회할 컬럼]
FROM [A테이블] AS [첫번째 별칭]
INNER JOIN [A테이블] AS [두번째 별칭]
- ON 뒤에는 조인할 조건이 필요한 것. 꼭 등호로 지정할 필요는 없다. ANY, IN, BETWEEN...등 모두 가능
IF문
- 엑셀과 같음. IF(조건, 조건이 참일 때 리턴 값, 조건이 거짓일 때 리턴 값)
IF(조건, 참일 때 리턴, 거짓일 때 리턴)
두 번째 시도
SELECT CASE WHEN GRADE < 8 THEN NULL ELSE NAME END,
GRADE,
MARKS
FROM STUDENTS S LEFT JOIN GRADES G ON S.MARKS >= MIN_MARK AND S.MARKS <= MAX_MARK
ORDER BY GRADE DESC, NAME, MARKS
;
참조
[HackerRank] The Report
📖 문제 🧑🏻💻 풀이 과정 1) 문제 이해 및 접근 등급 테이블에서 해당 범위 안에 속하면 등급을 매겨야 하므로 조인으로 데이터 결합 출력에서 등급이 특정 수준 이하이면 NULL 값을 출력해
unho94.tistory.com