|
| 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