https://school.programmers.co.kr/learn/courses/30/lessons/276036
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다. A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자 B : C# 스킬을 가진 개발자 C : 그 외의 Front End 개발자 GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요. 결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
개인적으로 여태 푼 문제 중 가장 어려웠다. 며칠 간 고민 끝에 다른사람 풀이를 참고했다.
WITH TEMP1 AS (
SELECT
SUM(CODE) AS FRONT_CODE
FROM
SKILLCODES
WHERE
CATEGORY = "Front End"
),
TEMP2 AS (
SELECT
CASE
WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'
ELSE NULL
END AS GRADE,
ID, EMAIL
FROM
DEVELOPERS
ORDER BY
GRADE, ID
)
SELECT *
FROM TEMP2
WHERE GRADE IS NOT NULL
코드를 차근차근 살펴보자. TEMP1이라는 가상 테이블이다.
SELECT
SUM(CODE) AS FRONT_CODE
FROM
SKILLCODES
WHERE
CATEGORY = "Front End"
프런트엔드 개발자를 조건으로 해서 모든 코드들의 합을 구한다. 나는 이렇게 생각을 못해봤다. 별 중요한 조건이 아니라고 생각했다. 나는 그레이드를 구하고 FRONT END를 구하면 된다고 생각했는데 이러면 안된다. 저렇게 쿼리를 쓰면 프런트 엔드 기술의 코드를 다 합한다.
SELECT
CASE
WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'
ELSE NULL
END AS GRADE,
ID, EMAIL
FROM
DEVELOPERS
ORDER BY
GRADE, ID
CASE WHEN 절 구문을 집중해서 보자
CASE
WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'
(SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A' 여기서
SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) 이 쿼리는 프런트엔드 개발자를 찾는 코드이다.
TEMP1에 있는 테이블은 모두 프런트 엔드 기술의 코드다. 그걸 합 한게 FRONT_CODE이니 이거를 SKILL_CODE 와& 연산 해서 0이상이면 프런트엔드 코드가 나오고 0이면 백엔드 코드가 나온다.
SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) 이 코드는 엔드 연산자를 하고 이름이 파이썬인 코드를 찾는 다.
나머지도 원리가 같은 쿼리를 쓴다.
'MYSQL > 프로그래머스 LV04' 카테고리의 다른 글
오프라인/온라인 판매 데이터 통합하기 (1) | 2025.03.21 |
---|---|
취소되지 않은 진료 예약 조회하기 (0) | 2025.03.21 |
자동차 대여 기록 별 대여 금액 구하기 (0) | 2025.03.20 |
저자 별 카테고리 별 매출액 집계하기 (0) | 2025.03.15 |
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (1) | 2025.03.15 |