하루에 하나씩 공부하기
언어별 개발자 분류하기-LV4 본문
- 문제
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.
- A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
- B : C# 스킬을 가진 개발자
- C : 그 외의 Front End 개발자
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
코딩테스트 연습 - 언어별 개발자 분류하기 | 프로그래머스 스쿨
- 키포인트
1. 이진수 처리와 잘못된 접근 방식 - 많이 헤맴
십진수 > 이진수 처리 방법인 BIN()을 쓰는게 아니라 그냥 십진수 자체로 처리하면 됨
D.SKILL_CODE & FE.SKILL_CODE : 이렇게만 해도 프론트엔드 해당 언어 필터링 가능 > WHEN 1 이면 출력
2. CASE WHEN 절의 ELSE 값 설정
ELSE 에 0을 두고, 설정하지 않기도 했지만 NULL로 처리하고 WHERE 절로 IS NOT NULL 처리하면 해당하지 않는 값들을 출력하지 않을 수 있음
- 코드
WITH FE AS (
SELECT SUM(CODE) AS SKILL_CODE
FROM SKILLCODES
WHERE CATEGORY='Front End'
), DEV_GRADE AS (
SELECT ID, EMAIL,
CASE
WHEN D.SKILL_CODE & FE.SKILL_CODE AND D.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME='Python') THEN 'A'
WHEN D.SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME='C#') THEN 'B'
WHEN D.SKILL_CODE & FE.SKILL_CODE THEN 'C'
ELSE NULL
END AS GRADE
FROM DEVELOPERS D, FE)
SELECT GRADE, ID, EMAIL
FROM FE, DEV_GRADE
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;
WITH GA AS(
SELECT ID, EMAIL,
CASE
WHEN COUNT(CASE WHEN CATEGORY='Front End' THEN 1 END)>0
AND COUNT(CASE WHEN NAME='Python' THEN 1 END)>0 THEN 3
WHEN COUNT(CASE WHEN NAME='C#' THEN 1 END)>0 THEN 2
WHEN COUNT(CASE WHEN CATEGORY='Front End' THEN 1 END)>0 THEN 1
END AS SCORE
FROM DEVELOPERS D JOIN SKILLCODES S ON D.SKILL_CODE & S.CODE
GROUP BY ID, EMAIL
HAVING SCORE>0
)
SELECT
CASE WHEN SCORE=3 THEN 'A'
WHEN SCORE=2 THEN 'B'
WHEN SCORE=1 THEN 'C'
END AS GRADE, ID, EMAIL
FROM GA
ORDER BY GRADE, ID;