w3school.com 에서 실습 진행 후
문제 1 . type of triangle - 해커랭크
case -> end 로 끝내기
팁 : case 문 작성 해보고, * 전체 출력해보기
처음 내 코드
중간 코드
select case
when A = B AND B = C THEN "Equilateral"
when A + B <= C OR A + C <+ B OR B + C <= A THEN "Not a Triangle"
when A = B OR B = C OR A = C THEN "Isocseles"#이미 정삼각형은 위에 정의해서 괜찮음, 순서 중요
ELSE 'OTHER'
END, A, B, C
FROM Triangles
이런식으로 끝에 END, A, B, C 이렇게 쓰고 확인 먼저 해보기.
이 때, 위 코드에서 NOT A TRANGLE 순서 중요함
(다른 조건에도 공통적으로 겹칠 수 있기 때문에)
정답 코드
주의 : 쉼표 사용하지 않기 !!!
개념설명 먼저
📌 SQL로 카테고리별 평균 가격을 가로로 피벗하기
목적
- categoryid별 price의 평균을 세로(row) 가 아닌 가로(column) 방향으로 정리하고자 할 때 사용한다.
- 즉, "카테고리별 평균을 한 줄에 보고 싶다"는 경우.
예시 데이터
productid categoryid price
1 | 1 | 100 |
2 | 2 | 200 |
3 | 1 | 300 |
4 | 3 | 400 |
원하는 출력 결과
category1_avg category2_avg category3_avg
200.0 | 200.0 | 400.0 |
✅ 해결 방법: CASE WHEN + AVG() 사용
SELECT
AVG(CASE WHEN categoryid = 1 THEN price ELSE NULL END) AS category1_avg,
AVG(CASE WHEN categoryid = 2 THEN price ELSE NULL END) AS category2_avg,
AVG(CASE WHEN categoryid = 3 THEN price ELSE NULL END) AS category3_avg
FROM Products;
🧠 작동 원리 설명
- CASE WHEN categoryid = 1 THEN price ELSE NULL END
→ categoryid가 1일 때만 price 값을 반환, 나머지는 NULL로 처리됨 - AVG(...)는 NULL을 제외하고 계산하므로,
→ categoryid = 1인 가격만 평균됨 - 결과적으로 카테고리별 평균이 각각 다른 열(column)에 표현됨
📌 장점
항목 설명
피벗 형태 요약 | 세로로 그룹핑하는 GROUP BY 대신, 가로로 통계치를 정리 가능 |
비교 용이성 | 카테고리별 값을 한 줄에 비교 가능 |
조건 유연성 | CASE 조건을 자유롭게 확장 가능 (예: 날짜 조건, 상태코드 등) |
🔧 추가 팁
- ELSE NULL은 생략해도 동작함 (CASE WHEN ... THEN 값 END만으로도 NULL 처리됨)
- 조건이 많아질 경우 쿼리가 길어지므로, 컬럼별 설명을 별칭(alias)으로 명확히 정리하는 것이 좋음
🧩 비슷한 구조: SUM, COUNT 활용 예
SELECT
COUNT(CASE WHEN categoryid = 1 THEN 1 END) AS category1_count,
SUM(CASE WHEN categoryid = 2 THEN price END) AS category2_total
FROM Products;
이 기법은 정적인 피벗에 유용하며, categoryid가 고정값(1, 2, 3 등)일 때 가장 적합
만약 값이 동적으로 바뀌는 경우, 동적 SQL이나 **데이터 시각화 도구(Power BI, Tableau)**를 사용하는 것이 더 효율적
문제 2. - 리트코드
1179. Reformat Department Table
내가 작성한 코드는
SELECT ID가 빠져있고, case when 이 밖에 있었음
-> case when 은 괄호 밖에 쓰는게 아니라 안에다가 써 준다.
정답쿼리 - ELSE NULL 생략 가능
SELECT
id,
SUM(CASE WHEN month = 'Jan' THEN revenue END) AS Jan_revenue,
SUM(CASE WHEN month = 'Feb' THEN revenue END) AS Feb_revenue,
SUM(CASE WHEN month = 'Mar' THEN revenue END) AS Mar_revenue,
SUM(CASE WHEN month = 'Apr' THEN revenue END) AS Apr_revenue,
SUM(CASE WHEN month = 'May' THEN revenue END) AS May_revenue,
SUM(CASE WHEN month = 'Jun' THEN revenue END) AS Jun_revenue,
SUM(CASE WHEN month = 'Jul' THEN revenue END) AS Jul_revenue,
SUM(CASE WHEN month = 'Aug' THEN revenue END) AS Aug_revenue,
SUM(CASE WHEN month = 'Sep' THEN revenue END) AS Sep_revenue,
SUM(CASE WHEN month = 'Oct' THEN revenue END) AS Oct_revenue,
SUM(CASE WHEN month = 'Nov' THEN revenue END) AS Nov_revenue,
SUM(CASE WHEN month = 'Dec' THEN revenue END) AS Dec_revenue
FROM department
GROUP BY id;
'DATA > SQL' 카테고리의 다른 글
RDB — 중복 없이 설계하고 JOIN 제대로 쓰는 법 (1) | 2025.06.01 |
---|---|
[해커랭크] Top Earners - Group by (0) | 2025.05.20 |
해커랭크 Revising Aggregations - Averages 외 5문제 (0) | 2025.05.16 |
MySQL : WorkBench PK 설정 및 Table 구조 (0) | 2025.02.10 |