본문 바로가기

DATA/SQL

[데이터리안 중급sql] CASE WHEN

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;

728x90