개발지식 먹는 하마 님의 블로그
SQL - 피벗 테이블 본문
[ 피벗 테이블 ]
대량의 데이터 중 내가 원하는 데이터만을 집계해서 보여주는 테이블,
행 데이터를 열 데이터로 전환, 세로형 데이터를 가로형 데이터로 보여주는 형식이다.
[ 피벗 테이블 작성 방법 ]
- 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 |