Skip to content

Commit e42a49e

Browse files
committed
배수빈: [SQL] 언어별 개발자 분류하기_241122
1 parent 1d224d5 commit e42a49e

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
-- 코드를 작성해주세요
2+
-- GRADE가 존재하는 개발자의 GRADE별 개발자의 정보를 조회
3+
4+
-- CTE 이용
5+
WITH FE AS(
6+
SELECT SUM(CODE) AS CODE
7+
FROM SKILLCODES
8+
WHERE CATEGORY = "Front End"
9+
)
10+
, Python AS(
11+
SELECT CODE
12+
FROM SKILLCODES
13+
WHERE NAME = "Python"
14+
)
15+
, C AS(
16+
SELECT CODE
17+
FROM SKILLCODES
18+
WHERE NAME = "C#"
19+
)
20+
, GRADES AS(
21+
SELECT
22+
CASE
23+
WHEN d.SKILL_CODE & f.CODE !=0 AND d.SKILL_CODE & p.CODE !=0 THEN 'A'
24+
WHEN d.SKILL_CODE & c.CODE != 0 THEN 'B'
25+
WHEN d.SKILL_CODE & f.CODE != 0 THEN 'C'
26+
END AS GRADE
27+
, d.ID, d.EMAIL
28+
FROM DEVELOPERS d, FE f, Python p, C c
29+
)
30+
SELECT *
31+
FROM GRADES g
32+
WHERE GRADE IS NOT NULL
33+
ORDER BY g.GRADE, g.ID
34+
35+
-- 각 CTE를 테이블 처럼 암시적 조인으로 사용
36+
-- 각 개발자마다 CTE반복 참조하며 CASE WHEN조건 매번 계산
37+
38+
39+
40+
-- 최적화
41+
WITH FE AS (
42+
SELECT SUM(CODE) AS CODE
43+
FROM SKILLCODES
44+
WHERE CATEGORY = "Front End"
45+
),
46+
SKILLS AS (
47+
SELECT
48+
MAX(CASE WHEN NAME = "C#" THEN CODE END) AS C_CODE,
49+
MAX(CASE WHEN NAME = "Python" THEN CODE END) AS P_CODE,
50+
(SELECT CODE FROM FE) AS FE_CODE
51+
FROM SKILLCODES
52+
),
53+
DEVELOPER_FLAGS AS (
54+
SELECT
55+
d.ID,
56+
d.EMAIL,
57+
d.SKILL_CODE,
58+
(d.SKILL_CODE & s.FE_CODE) AS IS_FE,
59+
(d.SKILL_CODE & s.P_CODE) AS IS_PYTHON,
60+
(d.SKILL_CODE & s.C_CODE) AS IS_C
61+
FROM DEVELOPERS d
62+
CROSS JOIN SKILLS s
63+
),
64+
GRADES AS (
65+
SELECT
66+
CASE
67+
WHEN IS_FE != 0 AND IS_PYTHON != 0 THEN 'A'
68+
WHEN IS_C != 0 THEN 'B'
69+
WHEN IS_FE != 0 THEN 'C'
70+
END AS GRADE,
71+
ID,
72+
EMAIL
73+
FROM DEVELOPER_FLAGS
74+
)
75+
SELECT *
76+
FROM GRADES
77+
WHERE GRADE IS NOT NULL
78+
ORDER BY GRADE, ID;

0 commit comments

Comments
 (0)