Link
Tables
erDiagram
SKILLCODES {
NAME VARCHAR PK
CATEGORY VARCHAR
CODE INTEGER PK
}
DEVELOPERS {
ID VARCHAR PK
FIRST_NAME VARCHAR
LAST_NAME VARCHAR
EMAIL VARCHAR PK
SKILL_CODE INTEGER
}
SKILLCODES ||--o{ DEVELOPERS : Skills
Mermaid
복사
Question
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.
•
A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
•
B : C# 스킬을 가진 개발자
•
C : 그 외의 Front End 개발자
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
DataFlow
DEVELOPERS 테이블에 SKILLCODES를 조인
CASE WHEN 으로 GRADE 분류
문자열 관련 방법으로 엄청 오래 고민헸지만, 한줄 조인으로 해결되는 비트 매칭이라는 방법이 있음
그리고 GROUP CONCAT 사용하면 바로임
Answer
WITH code_detail AS (
SELECT
CODE,
NAME,
CATEGORY
FROM SKILLCODES
),
dev_detail AS (
SELECT
ID,
EMAIL,
SKILL_CODE
FROM DEVELOPERS
),
result AS (
SELECT
d.ID,
d.EMAIL,
c.NAME,
c.CATEGORY
FROM dev_detail d
JOIN code_detail c
ON (d.SKILL_CODE & c.CODE) = c.CODE
),
grade AS (
SELECT
ID,
EMAIL,
GROUP_CONCAT(DISTINCT NAME ORDER BY NAME SEPARATOR ',') AS lang,
GROUP_CONCAT(DISTINCT CATEGORY ORDER BY CATEGORY SEPARATOR ',') AS cate
FROM result
GROUP BY ID, EMAIL
)
SELECT
CASE
WHEN INSTR(cate, 'Front End') > 0 AND INSTR(lang, 'Python') > 0 THEN 'A'
WHEN INSTR(lang, 'C#') > 0 THEN 'B'
WHEN INSTR(cate, 'Front End') > 0 THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM grade
HAVING GRADE IS NOT NULL
ORDER BY GRADE ASC, ID ASC;
SQL
복사