SQL - 피봇테이블

yunssup·2025년 5월 29일

📖SQL

목록 보기
4/8

기초 문법까지는 어렵지 않게 했지만 피봇 테이블부터 어려워지기 시작해따....
고냥 나를 위한 정리본 ㅎㅎ


  • 테이블을 피봇 하는 것 = 축을 바꾼다는 뜻

스프레드 시트에서 피봇 테이블을 사용하는 것 까진 이해햇다!! 개념은 이해가 감...하지만 SQL 로 적용했을 때의 이해가 잘 가지 않았다...!! 요기서부턴 꼼꼼히 정리해볼게요😂


  • 한가지 기준으로 데이터 집계 -> GROUP BY
  • 두가지 기준으로 데이터 확인 -> 피봇 테이블

LeetCode #1179로 피봇 테이블 연습하기

Input: 
Department table:
+------+---------+-------+
| id   | revenue | month |
+------+---------+-------+
| 1    | 8000    | Jan   |
| 2    | 9000    | Jan   |
| 3    | 10000   | Feb   |
| 1    | 7000    | Feb   |
| 1    | 6000    | Mar   |
+------+---------+-------+
Output: 
+------+-------------+-------------+-------------+-----+-------------+
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |
+------+-------------+-------------+-------------+-----+-------------+
| 1    | 8000        | 7000        | 6000        | ... | null        |
| 2    | 9000        | null        | null        | ... | null        |
| 3    | null        | 10000       | null        | ... | null        |
+------+-------------+-------------+-------------+-----+-------------+

input을 output 형태로 변환해줘야 함! 어떻게 ? 피봇 테이블 이용해서

1) input

  • id, revenue, month 에 대한 정보 세로 나열

2) output

  • 월 별 수익을 id 별로 나눠서 출력

CASE()를 사용해서 피봇 테이블 만들어주기

output의 열을 기준으로 변수를 채워 넣어가기

SELECT id
	  ,month
      ,revenue
      ,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
       ...
FROM 테이블명
GROUP BY id

이런식으로 12월까지 정리해주면, 각 달에 대한 수익이 정리된다.

중복되는 아이디 값을 하나로 묶어주기 위해서는 ID를 기준으로 그룹화를 시킨다. -> SUM()을 활용하여 NULL 값으로 생기는 오류를 해결한다.

GROUP BY 대상 값이 중복되지 않는다면 집계함수를 사용하지 않아도 되지만, 중복 값이 2개 이상일 경우, null을 이용해 걸러내야 함!!


참고 자료
https://salryujutme.tistory.com/49
https://xlworks.net/excel-pivot-basic/

1개의 댓글

comment-user-thumbnail
2025년 6월 5일

오옷 ! 요즘 SQL 공부 중인데 굉장히 유용하네요 .. 더 올려주세요 ! 🤩

답글 달기