본문 바로가기

[DB]DataBase/[SQL]

[SQLD] PIVOT 절과 UNPIVOT 절

728x90
반응형

PIVOT과 UNPIVOT

데이터의 구조를 변경(회전)하는 기능

PIVOT은 행을 열로 회전, UNPIVOT은 열을 행으로 회전시킴.

데이터의 구조

1) LONG DATA(Tldy data)

  • 하나의 속성이 하나의 컬럼으로 정의되어 값들이 여러 행으로 쌓이는 구조
  • RDBMS의 테이블 설계 방식
  • 다른 테이블과의 조인 연산이 가능한 구조

LONG DATA 예시

2) WIDE DATA(Cross table)

  • 행과 컬럼에 유의미한 정보 전달을 목적으로 작성하는 교차표
  • 하나의 속성값이 여러 컬럼으로 분리되어 표현
  • RDBMS에서 WIDE 형식으로 테이블 설계 시 값이 추가될 때마다 컬럼이 추가되어야 함
  • 다른 테이블과의 조인 연산이 불가함
  • 주로 데이터를 요약할 목적으로 사용

WIDE DATA 예시

컬럼의 정보는 부서 번호로, 하나의 관찰 대상(속성)을 한 컬럼으로 정의하지 않고 값의 종류 별로 컬럼을 분리함.

 

데이터 구조 변경

1) PIVOT: LONG -> WIDE

  • 교차표를 만드는 기능
  • STACK 컬럼, UNSTACK 컬럼, VALUE 컬럼의 정의가 중요
  • FROM 절에 STACK, UNSTACK, VALUE 컬럼명만 기술
    • 필요 시 서브쿼리를 사용하여 필요 컬럼 제한
  • PIVOT 절에 UNSTACK, VALUE 컬럼명 기술
  • PIVOT 절 IN 연산자에 UNSTACK 컬럼 값을 정의
  • FROM 절에 선언된 컬럼 중 PIVOT 절에서 선언한 VALUE 컬럼, UNSTACK 컬럼을 제외한 모든 컬럼은 STACK 컬럼이 됨

PIVOT 문장

반드시 FROM 절에 STACK 컬럼, UNSTACK 컬럼, VALUE 컬럼 모두 명시해야 함.

PIVOT 예시

-> EMP 테이블에서 JOB 별 DEPTNO 별 도수(COUNT) 출력

PIVOT 예시 쿼리

  • FROM 절 서브쿼리 안에 JOB이 없으면 부서별 도수가 출력됨
  • FROM 절에 서브 쿼리로 특정 컬럼을 제한하지 않으면 STACK 컬럼이 많아짐
    • FROM 절에 서브쿼리로 필요한 컬럼만 정의하지 않으면 EMP 테이블의 모든 컬럼 중 PIVOT 절에 선언 된 EMPNO, DEPTNO 컬럼을 제외한 모든 컬럼이 STACK 처리 됨

 

2) UNPIVOT: WIDE -> LONG

  • WIDE 데이터를 LONG 데이터로 변경하는 문법
  • STACK 컬럼
    • 이미 UNSTACK 되어 있는 여러 컬럼을 하나의 컬럼으로 STACK 시 새로 만들 컬럼명 (사용자 정의)
  • VALUE 컬럼
    • 교차표에서 셀 자리 값(VALUE)을 하나의 컬럼으로 표현하고자 할 때 새로 만들 컬럼명 (사용자 정의)
  • 값1, 값2, ...
    • 실제 UNSTACK 되어 있는 컬럼 이름들

UNPIVOT 문장
UNPIVOT 예시
UNPIVOT 예시 쿼리

-> 월~일 값들은 컬럼명이므로 컬럼명과 테이블명처럼 대명사(객체 이름)는 쌍따옴표로 붙이지 않음

 

반응형

'[DB]DataBase > [SQL]' 카테고리의 다른 글

[SQLD] DML  (0) 2024.05.21
[SQLD] 정규 표현식  (0) 2024.05.20
[SQLD] 계층형 질의와 셀프 조인  (0) 2024.05.19
[SQLD] Top N 쿼리  (0) 2024.05.18
[SQLD] 윈도우 함수  (0) 2024.05.16