Lv4. 언어별 개발자 분류하기 (MySQL)
링크: https://school.programmers.co.kr/learn/courses/30/lessons/276036
내가 작성한 코드
SELECT * FROM (
SELECT
CASE
-- A : Front End 와 Python 스킬을 동시에 가짐
WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0
AND (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0 THEN 'A'
-- B : C# 스킬을 가짐
WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) > 0 THEN 'B'
-- C : 그 외의 Front End 개발자
WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0 THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM DEVELOPERS
) AS RESULT
WHERE GRADE IS NOT NULL -- GRADE가 존재하는 개발자만 조회하기 위함
ORDER BY GRADE, ID;
새로 배운 코드
WITH SKILLS AS (
SELECT
(SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End') AS FE_SUM,
(SELECT CODE FROM SKILLCODES WHERE NAME = 'Python') AS PY_CODE,
(SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') AS CS_CODE
)
SELECT * FROM (
SELECT
CASE
WHEN (SKILL_CODE & FE_SUM) > 0 AND (SKILL_CODE & PY_CODE) > 0 THEN 'A'
WHEN (SKILL_CODE & CS_CODE) > 0 THEN 'B'
WHEN (SKILL_CODE & FE_SUM) > 0 THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM DEVELOPERS, SKILLS
) AS RESULT
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;
문제 회고
- 문제를 풀다가 막히는 부분들이 생겨 Gemini와 다른 분들이 공유하신 코드들을 보고 해결하였다
1. Front End 찾는 부분에서 SUM을 한 이유
- Front End의 스킬들이 여러개인데, 이것을 OR 조건으로 하나하나 작성하면 코드가 길어진다
- 따라서 SUM(CODE)를 사용해 Front End 카테고리의 모든 점수를 하나로 합쳐
- 한 번의 비트 연산으로 해당 카테고리의 스킬 중 하나라도 보유하고 있는지 판단한다
2. GROUP BY를 사용하지 않고 서브쿼리로 묶은 이유
- WHERE절을 실행할 때 SELECT 절에서 정의한 별칭을 인식하지 못하므로 전체를 서브쿼리로 감싸줌으로써
- 바깥쪽 WHERE절에서 컬럼을 자유롭게 필터링 가능하다
3. 느낀점
- CASE절 안에서 서브쿼리를 활용한 복잡한 연산이 가능하다는 것을 배웠다
'코딩테스트' 카테고리의 다른 글
| [26.04.02 코테/회고(MySQL/Oracle)]-조건에 부합하는 중고거래 상태 조회하기 (0) | 2026.04.02 |
|---|---|
| [26.04.01 코테/회고(MySQL)]-조건에 맞는 사원 정보 조회하기 (0) | 2026.04.01 |
| [26.03.30 코테/회고(MySQL/Oracle)]-저자 별 카테고리 별 매출액 집계하기 (0) | 2026.03.30 |
| [26.03.27 코테/회고(MySQL)]-부모의 형질을 모두 가지는 대장균 찾기 (0) | 2026.03.27 |
| [26.03.26 코테/회고(MySQL/Oracle)]-입양 시각 구하기(2) (0) | 2026.03.26 |