Oracle에서 PIVOT과 UNPIVOT 사용법

Oracle의 PIVOTUNPIVOT 연산은 데이터의 형태를 변환하는 데 사용됩니다.

  • PIVOT: 행 데이터를 열로 변환.
  • UNPIVOT: 열 데이터를 행으로 변환.

이 기능은 데이터 분석 및 보고서 작성에서 매우 유용합니다. 아래에서 사용법과 함께 예제를 통해 자세히 알아보겠습니다.


1. PIVOT: 행을 열로 변환하기

PIVOT 기본 구조

SELECT <열 선택>, [<집계 함수>(<값>) AS <새로운 열 이름>]
FROM <테이블>
PIVOT (
<집계 함수>(<값>)
FOR <열> IN (<열 값 1>, <열 값 2>, ...)
);

예제 테이블

아래와 같은 SALES 테이블이 있다고 가정합니다.

REGIONYEARSALES
EAST20211000
WEST20211200
EAST20221500
WEST20221300

PIVOT 사용 예제

목표: YEAR를 기준으로 SALES 데이터를 열로 변환.

SELECT *
FROM SALES
PIVOT (
SUM(SALES) FOR YEAR IN (2021 AS "Y2021", 2022 AS "Y2022")
);

결과:

REGIONY2021Y2022
EAST10001500
WEST12001300

설명:

  • SUM(SALES)SALES 값을 합산합니다.
  • FOR YEAR IN (2021, 2022)YEAR 값(2021, 2022)을 열로 만듭니다.
  • 열 이름은 AS를 사용해 별칭(Y2021, Y2022)으로 지정했습니다.

다중 열을 사용한 PIVOT

만약 데이터를 REGION과 함께 집계하고 싶다면, PIVOT 전에 필요한 열을 선택합니다.

SELECT REGION, Y2021, Y2022
FROM SALES
PIVOT (
SUM(SALES) FOR YEAR IN (2021 AS "Y2021", 2022 AS "Y2022")
);

결과: 동일합니다.


2. UNPIVOT: 열을 행으로 변환하기

UNPIVOT 기본 구조

SELECT <열 선택>
FROM <테이블>
UNPIVOT (
<값> FOR <컬럼> IN (<열 1>, <열 2>, ...)
);

예제 테이블

위에서 PIVOT 결과로 얻은 데이터를 사용해 보겠습니다.

REGIONY2021Y2022
EAST10001500
WEST12001300

UNPIVOT 사용 예제

목표: Y2021Y2022 열을 YEARSALES로 변환.

SELECT REGION, YEAR, SALES
FROM (
SELECT REGION, Y2021, Y2022
FROM SALES
)
UNPIVOT (
SALES FOR YEAR IN (Y2021 AS '2021', Y2022 AS '2022')
);

결과:

REGIONYEARSALES
EAST20211000
EAST20221500
WEST20211200
WEST20221300

설명:

  • UNPIVOTY2021Y2022 열을 행으로 변환합니다.
  • FOR YEAR는 새로운 열 이름(YEAR)을 정의합니다.
  • IN (Y2021 AS '2021', Y2022 AS '2022')는 기존 열을 변환 후 매핑할 이름을 지정합니다.

3. PIVOT과 UNPIVOT 결합 예제

초기 테이블

다음은 초기 데이터를 기준으로 PIVOTUNPIVOT을 차례로 적용해 보겠습니다.

REGIONYEARSALES
EAST20211000
WEST20211200
EAST20221500
WEST20221300

PIVOT 적용

SELECT *
FROM SALES
PIVOT (
SUM(SALES) FOR YEAR IN (2021 AS Y2021, 2022 AS Y2022)
);

결과:

REGIONY2021Y2022
EAST10001500
WEST12001300

UNPIVOT 적용

PIVOT 결과 데이터를 다시 UNPIVOT을 사용해 원래 형태로 복원합니다.

SELECT REGION, YEAR, SALES
FROM (
SELECT REGION, Y2021, Y2022
FROM SALES
)
UNPIVOT (
SALES FOR YEAR IN (Y2021 AS '2021', Y2022 AS '2022')
);

결과:

REGIONYEARSALES
EAST20211000
EAST20221500
WEST20211200
WEST20221300

4. 응용 예제

예제: 다중 열 PIVOT

다음과 같은 EMPLOYEE_SALES 테이블이 있다고 가정합니다.

EMPLOYEEDEPTYEARSALES
AliceHR2021500
BobHR2021600
AliceIT2022700
BobIT2022800

목표: 부서별 연도별 판매 데이터를 PIVOT.

SELECT *
FROM EMPLOYEE_SALES
PIVOT (
SUM(SALES) FOR YEAR IN (2021 AS Y2021, 2022 AS Y2022)
);

결과:

EMPLOYEEDEPTY2021Y2022
AliceHR500NULL
BobHR600NULL
AliceITNULL700
BobITNULL800

예제: 다중 열 UNPIVOT

위의 결과 데이터를 다시 원래 데이터 형태로 복원합니다.

SELECT EMPLOYEE, DEPT, YEAR, SALES
FROM (
SELECT EMPLOYEE, DEPT, Y2021, Y2022
FROM EMPLOYEE_SALES
)
UNPIVOT (
SALES FOR YEAR IN (Y2021 AS '2021', Y2022 AS '2022')
);

결과:

EMPLOYEEDEPTYEARSALES
AliceHR2021500
BobHR2021600
AliceIT2022700
BobIT2022800

결론

Oracle의 PIVOTUNPIVOT은 데이터를 요약하거나 변환하는 데 매우 강력한 기능입니다.

  • PIVOT: 행 데이터를 열로 변환해 요약 데이터를 생성합니다.
  • UNPIVOT: 열 데이터를 행으로 변환해 세부 데이터를 복원하거나 분석에 활용합니다.

이 기능은 데이터 분석, 보고서 작성, 비즈니스 인텔리전스 작업에서 자주 사용되며, 효율적인 데이터 변환을 가능하게 합니다.

Leave a Comment