https://school.programmers.co.kr/learn/courses/30/lessons/276036
[문제]
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.
- A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
- B : C# 스킬을 가진 개발자
- C : 그 외의 Front End 개발자
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
[나의 풀이]
문제에 대한 궁금증:
Front End 스킬과 Python 스킬을 함께 가지면서 C#스킬을 가진 개발자는 어떻게 처리해야 하는가?
궁금증에 대한 답변:
Front End 스킬과 Python 스킬을 가졌다면 A등급 -> 나머지 중에 C# 스킬을 가졌다면 B등급 -> 나머지 중에 Front End 스킬을 가졌다면 C등급
WITH FF AS (
SELECT SUM(CODE) AS CODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
),
CC AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#'
),
PP AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python'
),
FIN AS (
SELECT
CASE
WHEN SKILL_CODE & (SELECT CODE FROM FF) > 0
AND SKILL_CODE & (SELECT CODE FROM PP) > 0 THEN 'A'
WHEN SKILL_CODE & (SELECT CODE FROM CC) > 0 THEN 'B'
WHEN SKILL_CODE & (SELECT CODE FROM FF) > 0 THEN 'C'
ELSE NULL
END AS GRADE,
ID, EMAIL
FROM DEVELOPERS
)
SELECT *
FROM FIN
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;
[다른 풀이]
1)
SELECT
CASE
WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY LIKE 'FRONT%'))
AND SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'PYTHON') THEN 'A'
WHEN SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') THEN 'B'
WHEN SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY LIKE 'FRONT%') THEN 'C'
ELSE NULL
END AS GRADE
,ID, EMAIL
FROM DEVELOPERS
GROUP BY GRADE, ID, EMAIL
HAVING GRADE IS NOT NULL
ORDER BY GRADE, ID
2)
WITH main AS (
SELECT
d.ID,
d.EMAIL,
group_concat(s.NAME) AS NAME,
group_concat(s.CATEGORY) AS CATEGORY
FROM DEVELOPERS d
JOIN SKILLCODES s ON d.SKILL_CODE & s.CODE = s.CODE
GROUP BY d.ID, d.EMAIL
)
SELECT *
FROM (
SELECT
CASE
WHEN NAME LIKE '%Python%' AND CATEGORY LIKE '%Front End%' THEN 'A'
WHEN NAME LIKE '%C#%' THEN 'B'
WHEN CATEGORY LIKE '%Front End%' THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM main
) A
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;
⭐GROUP_CONCAT이란?
MySQL 및 일부 데이터베이스 시스템(예: SQLite)에서 사용 가능한 집계 함수로, 여러 행의 값을 하나의 문자열로 결합하는 데 사용됩니다.
- GROUP_CONCAT은 GROUP BY와 함께 사용하여 특정 그룹 내의 여러 행 값을 쉼표 또는 사용자가 지정한 구분자로 연결된 문자열로 반환합니다.
- 예를 들어, 하나의 개발자가 여러 기술을 보유한 경우, 이 기술들을 하나의 문자열로 결합해 반환합니다.
(예시)
-참고
3)
SELECT CASE
WHEN SUM(CASE WHEN a.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN a.NAME = 'Python' THEN 1 ELSE 0 END) > 0 THEN 'A'
WHEN SUM(CASE WHEN a.NAME = 'C#' THEN 1 ELSE 0 END) > 0 THEN 'B'
WHEN SUM(CASE WHEN a.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0 THEN 'C'
END AS GRADE,
b.ID, b.EMAIL
FROM SKILLCODES AS a LEFT OUTER JOIN DEVELOPERS AS b
ON a.CODE & b.SKILL_CODE
GROUP BY b.ID, b.EMAIL
HAVING GRADE IS NOT null
ORDER BY GRADE, b.ID;
'프로그래머스 > My SQL' 카테고리의 다른 글
FrontEnd 개발자 찾기 (0) | 2025.01.01 |
---|---|
💫멸종위기의 대장균 찾기 (0) | 2024.12.31 |
상품을 구매한 회원 비율 구하기 (1) | 2024.12.30 |
특정 세대의 대장균 찾기 (0) | 2024.12.29 |
연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (1) | 2024.12.28 |