[SQL 고득점 Kit] 언어별 개발자 분류하기

썹스·2024년 3월 21일

❓ 문제

DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.

  • A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
  • B : C# 스킬을 가진 개발자
  • C : 그 외의 Front End 개발자

GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.

❗️ 문제 풀이

with tb as(
    select
        D.ID
        ,GROUP_CONCAT(S.NAME SEPARATOR '_') as skill
        ,GROUP_CONCAT(S.CATEGORY SEPARATOR '_') as skill_category
    from SKILLCODES as S, DEVELOPERS as D
    where S.CODE & D.SKILL_CODE > 0
    group by 1
    order by 1
)

select
    distinct case
        when tb.skill like '%Python%' and tb.skill_category like '%Front End%' then 'A'
        when tb.skill like '%C#%' then 'B'
        when tb.skill_category like '%Front End%' then 'C'
    end as GRADE
    ,D.ID
    ,D.EMAIL
from SKILLCODES as S, DEVELOPERS as D, tb
where 1=1
    and D.ID = tb.ID
HAVING 1=1
    and GRADE IS NOT NULL
order by 1, 2

📚 배운점/느낀점

SKILLCODES 테이블의 경우 테스트 케이스에 따라 스킬 CODE 값이 달라지기 때문에 문제를 푸는데 있어 조금 고생했다. (스킬 CODE 값이 고정값인 줄 알았다...)

추가로 해당 문제를 풀면서 불가피하게 GROUP BY 절 없이 HAVING 절을 사용했다.
GROUP BY 절을 사용하면 데이터베이스가 먼저 그룹화하고 그 후에 조건(HAVING)을 적용할 수 있어서 필터링 작업을 최적화할 수 있다. 반면에 HAVING 절만 사용하는 경우에는 모든 행을 그룹화한 후에 조건(HAVING)을 적용하므로 성능에 영향을 줄 수 있다. 때문에 일반적으로 HAVING 절은 GROUP BY 절 뒤에 작성하는 것을 권장한다.



🔗 Reference

https://school.programmers.co.kr/learn/courses/30/lessons/276036

profile
코린이

0개의 댓글