본문 바로가기

코딩일기

SQL 코드카타 171 - The Report

https://www.hackerrank.com/challenges/the-report/problem?isFullScreen=true

 

The Report | HackerRank

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

www.hackerrank.com

 

Column Type
ID Integer
Name String
Marks Integer

 

Students 테이블:

  • ID: 테이블의 고유 키
  • Name : 이름
  • Marks : 점수
 

Ketty는 Eve에게 세 개의 열(Name, Grade, Mark)을 포함하는 보고서를 생성하는 과제를 부여했습니다. Ketty는 8보다 낮은 점수를 받은 학생들의 이름이 포함되지 않기를 원합니다. 보고서는 Grade가 높은 순서대로 정렬되어야 합니다. 동일한 Grade(8-10)를 받은 학생이 여러 명일 경우, 해당 학생들은 이름을 알파벳 순서대로 정렬해야 합니다. 마지막으로, Grade가 8보다 낮은 경우, 이름을 "NULL"로 사용하고 해당 Grade는 내림차순으로 정렬합니다. 동일한 Grade(1-7)를 받은 학생이 여러 명일 경우, 해당 학생들은 점수를 오름차순으로 정렬해야 합니다.

 

select *
from Students S
inner join Grades G on S.Marks between G.Min_Mark and G.Max_Mark

 

조건에 따라 두 테이블을 결합한다.

Students의 Marks열의 Grades에 포함되는 점수 구간에 따라서 Grade를 표시하도록 한다.

 

select
    case
        when G.Grade >= 8 then  S.Name
        else 'NULL'
    end,
    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,

 

필요한 데이터를 필터링하고 Grade가 8보다 작은 경우에는 이름을 NULL로 표기한다.

그리고 Grade를 기준으로 내림차순 정렬한다.

 

select
    case
        when G.Grade >= 8 then  S.Name
        else 'NULL'
    end,
    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,
    case
        when G.Grade >= 8 then  S.Name
        when G.Grade < 8 then  S.Marks
        else NULL
    end

 

정렬에 조건을 추가한다.

case when 구문으로 Grade가 8 이상일 경우 이름을 기준으로 정렬하고 아닐 경우 점수를 기준으로 정렬한다.

 

처음 사용해보는 개념이 많았던 문제였다. 두 테이블을 결합할 때, 조건을 사용하는 것은 몇번 보았지만 between을 사용해본것은 처음이었고 order by를 통해서 정렬을 할 때, 조건문을 적용할 수 있는지는 몰랐다.