https://school.programmers.co.kr/learn/courses/30/lessons/276036
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드설명
CASE WHEN + SUM + GROUP BY + HAVING 을 활용합니다.
문제에서 유의해야할점은, GRADE가 NULL인 데이터는 필터링 하는 부분입니다.
처음에는 아래와 같이 WHERE 절에 GRADE IS NOT NULL을 활용했습니다.
WHERE GRADE IS NOT NULL
하지만, 위와 같이 작성하면 에러가 납니다.
이유는, GRADE 컬럼의 생성 시점이 WHERE 절보다 뒤에서 실행되기 때문이다.
기본적으로 SQL 실행순서를 보면,
1. FROM -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 입니다.
이떄, GROUP BY GRADE를 통해서 그룹핑하는 과정이 있는데, WHERE 절에는 GROUP BY 보다 실행되기에 아직 GRADE에 관한 정보가 없습니다. 그렇기에 HAVING에 넣음으로써 필터링해줍니다.
또한, 각 SKILLCODES는 비트연산에서 1 << N 식으로 2^N 제곱형식으로 숫자가 나타나 있기 대문에, 이 합값을 구하면 BITMASKING을 통해서 어떤 종류로 이루어져있는지 알 수 있습니다.
코드
SELECT
CASE
WHEN ( D.SKILL_CODE) & ( SELECT SUM(CODE) FROM SKILLCODES GROUP BY CATEGORY HAVING CATEGORY IN ('FRONT END')) > 0 AND ( D.SKILL_CODE ) & ( SELECT CODE FROM SKILLCODES WHERE NAME = 'PYTHON') > 0 THEN 'A'
WHEN ( D.SKILL_CODE ) & ( SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') > 0 THEN 'B'
WHEN ( D.SKILL_CODE ) & ( SELECT SUM(CODE) FROM SKILLCODES GROUP BY CATEGORY HAVING CATEGORY IN ('FRONT END')) > 0 THEN 'C'
ELSE NULL
END AS GRADE, D.ID, D.EMAIL
FROM SKILLCODES AS S
INNER JOIN DEVELOPERS AS D
ON S.CODE & D.SKILL_CODE > 0
# WHERE GRADE IS NOT NULL( WHERE GRADE IS NOT NULL은 UNKNOWN COLUMN이지만 HAVING으로 사용하면 작동한다.)
GROUP BY GRADE, D.ID, D.EMAIL
HAVING GRADE IS NOT NULL
ORDER BY GRADE ASC, D.ID ASC