본문 바로가기
데이터분석 공부하기/프로그래머스 SQL 고득점 키트

[SQL] SQL로 피봇테이블 만들기/Pivoting Data in SQL/

by Confident Beginner 2023. 1. 18.

Input

: 주어진 데이터(내가 만듦)

 

<Example> 

id Revenue month
1 200 Jan
2 300 Feb
1 700 Jan
1 300 Feb
3 500 Mar
2 250 Apr
1 100 Jun

 

 

 

 

Expected

: 만들고 싶은 최종 데이터(~6월 까지만 작성)

id Jan_Revenue Feb_Revenue March_Revenue Apr_Revenue May_Revenue Jun_Revenue
1 900 300 Null Null Null 100
2 Null 300 Null 250 Null Null
3 Null Null 500 Null Null Null

 

 

피봇 테이블을 작성하는 것을 배웠다.

CASE 구문을 주로 사용해서 새로운 칼럼을 생성하는 기능이다.

 

 

최종데이터를보면 나의 목표(!)는

  • id를 기준으로 Group by 하기
  • 월 별 Revenue만 모아서 보기

 

여기서 주의 해야할 것은

기존 데이터를 보면 id가 여러번 중복되어서 나타난다는 점

 

문제 풀이 

 

SELECT 
		id
        , CASE WHEN month = 'Jan' Then revenue ELSE NULL END AS  Jan_Revenue 
        , CASE WHEN month = 'Feb' Then revenue ELSE NULL END AS  Feb_Revenue 
        , CASE WHEN month = 'Mar' Then revenue ELSE NULL END AS  Mar_Revenue 
        , CASE WHEN month = 'Apr' Then revenue ELSE NULL END AS  Apr_Revenue 
        , CASE WHEN month = 'May' Then revenue ELSE NULL END AS  May_Revenue 
        , CASE WHEN month = 'Jun' Then revenue ELSE NULL END AS  Jun_Revenue 

FROM Example

CASE 함수만 활용하여 실행해보면 다음과 같은 결과가 나올 것이다.

 

id Jan_Revenue Feb_Revenue March_Revenue Apr_Revenue May_Revenue Jun_Revenue
1 200          
2   300        
1 700          
1   300        
3     500      
2       250    
1           100

 

CASE WHEN month = 'Jan' Then revenue ELSE NULL END AS  Jan_Revenue

그니까 위에 case구문 한줄의 결과는 다음과 같다.

Jan_Revenue
200
 
700
 
 
 
 

 

 

하지만 내가 만들고 싶은 데이터의 모양은

id Jan_Revenue
1 900
2 Null
3 Null

이것!

 

 

따라서 내가 추가로 사용해야할 함수는

GROUP BY

SUM이다.

 

 

  • 'SUM'은 왜 써야 하나?

▶1월 달에 id가 1인 경우의 revenue가 두번 있는데, 나는 그 revenue가 합해진 [1월달/ID=1]인 경우의 합을 보고 싶은 것이다.

 

  • 어디에다가 'SUM'을 써야 하나?

CASE WHEN month = 'Jan' Then revenue ELSE NULL END  AS  Jan_Revenue 

이 빨간 부분을 감싸서 SUM을 해주면 된다.

빨간 부분은 아래 데이터들이기 때문에 요기에서의 200과 700을 합해주는 것이다.

200
 
700
 
 
 
 

 

▶추가로 잊지 말야할 것은 GROUP BY!  ID별로 보고 싶은 것이다. 까먹지 말것.

 

최종 코드는 다음과 같다.

SELECT 
		id
        , SUM(CASE WHEN month = 'Jan' Then revenue ELSE NULL END) AS  Jan_Revenue 
        , SUM(CASE WHEN month = 'Feb' Then revenue ELSE NULL END) AS  Feb_Revenue 
        , SUM(CASE WHEN month = 'Mar' Then revenue ELSE NULL END) AS  Mar_Revenue 
        , SUM(CASE WHEN month = 'Apr' Then revenue ELSE NULL END) AS  Apr_Revenue 
        , SUM(CASE WHEN month = 'May' Then revenue ELSE NULL END) AS  May_Revenue 
        , SUM(CASE WHEN month = 'Jun' Then revenue ELSE NULL END) AS  Jun_Revenue 

FROM Example
GROUP BY id

 

 


참고 링크 첨부!

 

https://mode.com/sql-tutorial/sql-pivot-table/

 

Pivoting Data in SQL | Advanced SQL - Mode

Get our weekly data newsletter Work-related distractions for every data enthusiast.

mode.com