프로그래머스) 언어별 개발자 분류하기
문제) 언어별 개발자 분류하기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해당 문제는 이전에 포스팅한 문제와 거의 유사한 문제이다. 그래서 풀때 쉽게 풀 수 있을거 같았으나 생각보다 오래 걸리게 되었다.
내가 작성한 실패 코드
select case when group_concat(b.NAME) like '%Python%' and group_concat(b.CATEGORY) like '%Front%' then 'A'
when group_concat(b.NAME) like '%C#%' then 'B'
when group_concat(b.CATEGORY) like '%Front%' then 'C' END 'GRADE', a.ID, a.EMAIL
from DEVELOPERS as a join SKILLCODES as b on b.CODE = a.SKILL_CODE & b.CODE
where b.NAME like 'Python' or b.NAME like 'C#' or b.CATEGORY = 'Front End'
group by a.ID, a.EMAIL
order by GRADE, a.ID
먼저 이전에 배운 비트 연산자 중 &를 활용하여 기술을 가지고 있는지를 확인 하는 부분을 작성하고 GROUP_CONCAT을 이용하여 사용자가 습득하고 있는 스킬의 이름과 스킬의 범주를 한번에 묶고 비교를 진행하였다.
이때 필용 없는 부분을 지우기 위해 조건절에 찾고 자하는 것들만 필터를 진행하였다.
그러나 해당 코드는 test case는 통과가 되었으나 제출 시 전부 실패하게 되었다.
왜 실패를 하게 되었는지 확인 할 방법이 없어 질문하기 쪽을 찾아봤다.(질문하기인데 왜 정답 코드를 적는지... 힌트만 좀 주시면 좋았을거 같았는데 ㅠㅠ)
질문하기 통과한 코드
WITH GROUPS_DEVEL AS (
SELECT
ID,
EMAIL,
GROUP_CONCAT(DISTINCT NAME, CATEGORY) as gc
FROM
SKILLCODES
JOIN
DEVELOPERS
ON DEVELOPERS.SKILL_CODE & SKILLCODES.CODE
GROUP BY ID, EMAIL
)
select CASE WHEN gc like '%Python%' and gc like '%Front%' THEN 'A'
WHEN gc like '%C#%' THEN 'B'
WHEN gc like '%Front%' THEN 'C'
END 'GRADE', ID, EMAIL
from GROUPS_DEVEL
having GRADE IS NOT NULL
ORDER BY GRADE, ID
그렇게 하여 정답 코드상의 코들 확인해 보니 내가 구하는 부분과 크게 다른 것이라고는 조건절에서 필터하는게 아닌 having에서 필터를 진행하는 것을 확인 할 수 있게 되었다.
이것을 바탕으로 기존의 코드를 수정해보니 정상적으로 통과가 됨을 확인 할 수 있었다.
내가 수정하여 통과한 코드
select case when group_concat(b.NAME) like '%Python%' and group_concat(b.CATEGORY) like '%Front%' then 'A'
when group_concat(b.NAME) like '%C#%' then 'B'
when group_concat(b.CATEGORY) like '%Front%' then 'C' END 'GRADE', a.ID, a.EMAIL
from DEVELOPERS as a join SKILLCODES as b on b.CODE = a.SKILL_CODE & b.CODE
group by a.ID, a.EMAIL
having GRADE IS NOT NULL
order by GRADE, a.ID
where과 having에 대하여 검색을 하다보면 아래와 같은 내용을 찾아 볼 수 있다.
출처 : https://wansook0316.github.io/cs/database/2020/04/25/where-having-%EC%B0%A8%EC%9D%B4.html
"전체 테이블 자체에서 쿼리를 수행하고 싶다면 where를, 전체 테이블을 그룹화 한뒤, 그 해당 그룹에서 어떠한 조건을 걸어 가져오고 싶다면 having을 사용"
위의 말 처럼 현재 내가 검색을 하고 싶은 것은 그룹화 된 곳에서 python, C#, Front End 를 가지고 있는 사람을 찾는 것이기에 where보다는 having이 맞게 사용하는 것이다.