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
'데이터분석 공부하기 > 프로그래머스 SQL 고득점 키트' 카테고리의 다른 글
[SQL/프로그래머스 SQL 고득점Kit] 중성화 여부 파악하기(Level 2) (0) | 2023.01.26 |
---|---|
[SQL/프로그래머스 SQL 고득점 Kit] 이름에 el이 들어가는 동물 찾기(Leve 2) (0) | 2023.01.25 |
[SQL/프로그래머스 SQL 고득점 Kit]_루시와 엘라 찾기(Level 2) (0) | 2023.01.25 |
[SQL/프로그래머스 SQL 고득점 kit] 자동차 대여 기록에서 장기/단기 대여 구분하기(Level 1) (0) | 2023.01.25 |
[SQL] DISTINCT 이해하기 (0) | 2023.01.23 |