
Rainy season.
SQL
& :# Front End 스킬 코드들을 모두 합산하여 하나의 값으로 반환
WITH fe AS (
SELECT SUM(CODE) AS CODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
),
# Python 스킬 코드 값을 반환
py AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python'
),
# C# 스킬 코드 값을 반환
cs AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#'
)
SELECT
# 각 개발자의 스킬 코드를 검사하여 GRADE를 결정
# Front End 스킬과 Python 스킬을 모두 가지고 있으면 'A'
CASE WHEN (d.SKILL_CODE & fe.CODE) > 0 AND (d.SKILL_CODE & py.CODE) > 0 THEN 'A'
# C# 스킬을 가지고 있으면 'B'
WHEN (d.SKILL_CODE & cs.CODE) > 0 THEN 'B'
# Front End 스킬만 가지고 있으면 'C'
WHEN (d.SKILL_CODE & fe.CODE) > 0 THEN 'C'
# 그 외는 'X' (필터링에서 제외될 값)
ELSE 'X' END GRADE
, d.ID
, d.EMAIL
# DEVELOPERS 테이블에서 각 개발자의 정보를 조회
FROM DEVELOPERS d
# 각 스킬 코드 값을 CROSS JOIN으로 결합
CROSS JOIN fe
CROSS JOIN py
CROSS JOIN cs
# 'X'가 아닌 GRADE만 필터링하여 조회
HAVING GRADE != 'X'
# 결과를 GRADE와 ID를 기준으로 오름차순 정렬
ORDER BY GRADE, d.ID
문제 접근 방법
필요한 스킬 코드 추출 (WITH 절)
fe CTE : Front End 스킬 코드들을 모두 합산하여 하나의 코드로 취합
py CTE : Python 스킬 코드 추출
cs CTE : C# 스킬 코드 추출
개발자 정보와 스킬 코드 매칭 :
DEVELOPERS 테이블과 스킬 코드 조인, 각 개발자의 스킬 코드 비교
CASE 문을 사용하여 각 개발자의 SKILL_CODE를 검사하여 GRADE 결정
Front End 스킬과 Python 스킬을 모두 가진 경우 GRADE는 'A'
C# 스킬을 가진 경우 GRADE는 'B'
Front End 스킬만 가진 경우 GRADE는 'C'
그 외의 경우는 'X'로 설정하여 필터링에서 제외
결과 정렬 및 필터링 :
GRADE가 'X'가 아닌 경우만 필터링
결과를 GRADE와 ID 기준으로 오름차순 정렬
오늘의 한 줄.
알찬 주말이었다 : )