Coding Test/SQL
[Programmers Lv.4] 언어별 개발자 분류하기 - 276036
ro_rdil_31
2025. 1. 12. 16:13
728x90
BIT_OR( ) 을 사용하여 특정 SKILL_CODE와 비교가 가능하게 한다.
Question
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해
집니다.
A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
B : C# 스킬을 가진 개발자
C : 그 외의 Front End 개발자
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
Point
- BIT_OR( ) : 여러 행의 값을 받아 각각의 비트에 대해 OR 연산을 수행한 결과를 반환.
- CASE 구문에서 0보다 큰지 확인하는 이유 : 비트 플래그는 정수로 표현되며, 비트가 활성화되지 않으면 결과는 0임.
- => 따라서 Python이면서 SKILL_CODE가 같으면 해당 & 연산 결과가 CODE 로 출력되기 때문에 조건에 해당하는 비트 값 즉, CODE 가 출력됨. (따라서 이는 0 이상이기 때문에 TRUE.)
Code (After 2509)
select
case
when max(category = 'Front End') and max(name = 'Python') then 'A'
when max(name = 'C#') then 'B'
when max(category = 'Front End') then 'C'
end as grade
, d.id
, d.email
from developers d
join skillcodes s on d.skill_code & s.code
group by 2, 3
having grade is not null
order by 1, 2
;
Code
SELECT CASE
WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) AND
(SKILL_CODE & (SELECT BIT_OR(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')) THEN 'A'
WHEN SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') THEN 'B'
WHEN SKILL_CODE & (SELECT BIT_OR(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End') THEN 'C'
END AS GRADE
, ID
, EMAIL
FROM DEVELOPERS
HAVING GRADE IS NOT NULL
ORDER BY 1, 2

now me
On my github
728x90