개발지식 먹는 하마 님의 블로그

SQL - 피벗 테이블 본문

MySQL

SQL - 피벗 테이블

devhippo 2025. 1. 17. 16:40

[ 피벗 테이블 ]

대량의 데이터 중 내가 원하는 데이터만을 집계해서 보여주는 테이블, 
행 데이터를 열 데이터로 전환, 세로형 데이터를 가로형 데이터로 보여주는 형식이다.

[ 피벗 테이블 작성 방법 ]

  • PIVOT 연산자 사용 (SQL에서만 사용가능하고 MYSQL에서는 사용이 불가하다)
    주어진 행 데이터를 열로 변환한다.
    피벗 대상 값에 대괄호를 해주어야 한다.
PIVOT (
    집계 함수(컬럼명)
    FOR 피벗대상컬럼 IN ([피벗대상값]) 
) AS 피벗테이블명;
  • 조건문
    CASE문과 IF문을 집계 함수 내에 사용하여 피벗테이블을 구성할 수 있다.
SELECT 
  name,
  SUM(IF(exam = 1, score, NULL)) AS exam1,
  SUM(IF(exam = 2, score, NULL)) AS exam2,
  SUM(IF(exam = 3, score, NULL)) AS exam3,
  SUM(IF(exam = 4, score, NULL)) AS exam4
FROM exams
GROUP BY name;

SELECT 
  name,
  SUM(CASE WHEN exam = 1 THEN score ELSE 0 END) AS exam1,
  SUM(CASE WHEN exam = 2 THEN score ELSE 0 END) AS exam2,
  SUM(CASE WHEN exam = 3 THEN score ELSE 0 END) AS exam3,
  SUM(CASE WHEN exam = 4 THEN score ELSE 0 END) AS exam4
FROM exams
GROUP BY name;

[ 집계 함수를 사용해야 하는 이유 ]

  • NULL 값을 제거한다.
  • 중복을 제거한다.
  • ★고유 값을 선택하도록 한다.★, 이미 고유 값인 경우 안정성을 보장한다.

ex) 날짜는 Date를 사용하는 것이 좋지만, 나는 이 예제가 가장 이해에 도움이 되었다.
[여행기]

id trip_year trip_month trip_day
1 2023 3 22
2 2023 7 15
3 2023 10 10
4 2023 10 14
5 2024 4 30
6 2024 8 25

행 데이터가 year, 열 데이터가 month, 집계되는 데이터가 day인 피벗테이블을 만들고자 한다.
이 때, 2023년의 10월에 올 수 있는 day는 10과 14로 총 2개이다.
그러나, 문자열 조합으로 약간의 꼼수를 부리지 않는한 둘 중 하나의 값만을 출력해야 한다.
이런 상황에서 고유값을 유지하기 위해 집계함수를 사용한다.
MAX를 사용하면 14, MIN을 사용하면 10, SUM은 둘의 합인 24, AVG는 둘의 평균인 12를 출력한다.

 MAX 10월
2023 14

 

'MySQL' 카테고리의 다른 글

SQL - 날짜 함수  (0) 2025.01.19
SQL - 윈도우 함수  (0) 2025.01.19
SQL 문법 - 서브쿼리, CTEs  (0) 2025.01.16
SQL 문법 - 조인  (0) 2025.01.16
SQL 문법 - 조건  (0) 2025.01.15