
📑 1. 문제설명



문제요약
- 테이블: DEVELOPERS, SKILLCODES
- 조건:
- A → Front End 스킬 + Python 스킬을 모두 가진 개발자
- B → C# 스킬을 가진 개발자
- C → 그 외 Front End 스킬을 가진 개발자
- 출력 컬럼 : GRADE, ID, EMAIL
- 정렬 기준 : GRADE, ID 오름차순
- 주의 : GRADE가 부여되는 개발자만 조회
⭐ 2. 정답코드
집계 방식(SQL 표준 JOIN + GROUP BY) 으로 해결한 쿼리이다.
SELEC문제 이중 CASE문을 썼다.
-- 코드를 작성해주세요
SELECT CASE
WHEN SUM(CASE WHEN s.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN s.NAME = 'PYTHON' THEN 1 ELSE 0 END) > 0
THEN 'A'
WHEN SUM(CASE WHEN s.NAME = 'C#' THEN 1 ELSE 0 END) > 0
THEN 'B'
WHEN SUM(CASE WHEN s.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0
THEN 'C'
END AS GRADE,
d.ID,
d.EMAIL
FROM SKILLCODES s
JOIN DEVELOPERS d
ON (s.CODE & d.SKILL_CODE) > 0
GROUP BY d.ID, d.EMAIL
HAVING GRADE IS NOT NULL
ORDER BY GRADE, d.ID;
1. JOIN
- d.SKILL_CODE & s.CODE > 0 → 개발자가 해당 스킬을 가지고 있으면 매칭
2. CASE + SUM
- SUM(CASE WHEN ... THEN 1 END) 방식으로 개발자가 가진 스킬 중 Python, C#, Front End 보유 여부 체크
- Python과 Front End 모두 있으면 A
- C# 있으면 B
- Front End만 있으면 C
3. GROUP BY
- 개발자(d.ID, d.EMAIL) 단위로 스킬 합쳐서 판별
4. HAVING GRADE IS NOT NULL
- GRADE가 매겨진 개발자만 출력
5. 정렬
- ORDER BY GRADE, d.ID
3. 비트 연산만으로 해결하는 쿼리
내가 궁금해서 찾아본 쿼리
이렇게 하면 조인을 할 필요가 쿼리가 깔끔하다.
그리고 JOIN 없이 DEVELOPERS 테이블만으로도 문제 조건을 처리할 수 있다.
SELECT CASE
WHEN (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0
AND (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0
THEN 'A'
WHEN (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) > 0
THEN 'B'
WHEN (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0
THEN 'C'
END AS GRADE,
d.ID,
d.EMAIL
FROM DEVELOPERS d
WHERE (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0
OR (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0
OR (d.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) > 0
ORDER BY GRADE, d.ID;