해당 범위는 SQLD 2024년에 추가된 범위라 기존 내용이 많이 부족하여 추가하였습니다.
기존내용
PIVOT / UNPIVOT (데이터의 구조를 변경하는 기능)
출처: 홍쌤의 데이터랩 유튜브
- 데이터의 구조
1) LONG DATA (Tidy Data)
- 하나의 속성이 하나의 컬럼으로 정의되어 값들이 여러 행으로 쌓이는 구조
- RDBMS의 테이블 설계 방식
- 다른 테이블과의 조인 연산이 가능한 구조
2) WIDE DATA (Cross Table)
- 행과 컬럼에 유의미한 정보 전달을 목적으로 작성하는 교차표
- 하나의 속성값이 여러 컬럼으로 분리되어 표현
- RDBMS에서 WIDE 형식으로 테이블 설계 시 값이 추가될 때마다 컬럼이 추가돼야 하므로 비효율적
- 다른 테이블과의 조인 연산이 불가함
- 주로 데이터를 요약할 목적으로 사용
DATA 구조변경
1) PIVOT: LONG → WIDE
2) UNPIVOT: WIDE → LONG
■ PIVOT
- 교차표를 만드는 기능
- STACK 컬럼, UNSTACK 컬럼, VALUE 컬럼의 정의가 중요.
- FROM 절에 STACK, UNSTACK, VALUE 컬럼명만 정의 필요
(필요 시 서브쿼리 사용하여 필요 컬럼 제한)
- PIVOT 절에 UNSTACK, VALUE 컬럼명 정의
- PIVOT 절 IN 연산자에 UNSTACK 컬럼 값 정의
- FROM 절에 선언된 컬럼 중 PIVOT 절에서 선언한 VALUE 컬럼, UNSTACK 컬럼을 제외한 모든 컬럼은 STACK 컬럼이 됨.
[문법]
SELECT *
FROM 테이블명 또는 서브쿼리
PIVOT (VALUE 컬럼명 FOR UNSTACK 컬럼명 IN (값1, 값2, 값3, ...));
※ 반드시 FROM 절에 STACK 컬럼, UNSTACK 컬럼, VALUE 컬럼 모두 명시
예제1. EMPLOYEE 테이블에서 아래와 같이 JOB_ID별 DEPARTNMENT_ID 별 도수 (COUNT) 출력하는 SQL문 작성
[아래]
[정답 SQL문]
[풀이]
※ FROM 절 서브쿼리 안에 JOB_ID 가 없으면 그냥 부서별로의 도수(COUNT) 출력
※ FROM 절에 서브쿼리로 컬럼을 제한하지 않으면 STACK 컬럼이 많아짐.
▶ FROM 절에 서브쿼리로 필요한 컬럼만 정의하지 않으면 EMPLOYEES 테이블의 모든 컬럼 중 PIVOT 절에 선언된 EMPLOYEE_ID, DEPARTMENT_ID 컬럼을 제외한 모든 컬럼이 STACK 처리 됨.
예제2. 아래 테이블에서 성별, 연도별, 구매량 총 합 표현 SQL문 작성
[아래]
년도 | 성별 | 지역 | 구매량 |
2008 | 남자 | 서울 | 1 |
2008 | 남자 | 경기 | 2 |
2008 | 여자 | 서울 | 3 |
2008 | 여자 | 경기 | 4 |
2009 | 남자 | 서울 | 5 |
2009 | 남자 | 경기 | 6 |
2009 | 여자 | 서울 | 7 |
2009 | 여자 | 경기 | 8 |
▼
성별 | 2008 | 2009 |
남자 | 3 | 11 |
여자 | 7 | 15 |
[정답 SQL문]
SELECT *
FROM (SELECT 년도, 성별, 구매량 FROM SALES)
PIVOT (SUM(구매량) FOR 년도 IN (2008, 2009));
다음글
[출처]
홍쌤의 데이터 랩 유튜브
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 30회 기출문제 오답 노트 (0) | 2024.03.02 |
---|---|
[SQLD] PIVOT / UNPIVOT (보강-2) (0) | 2024.03.01 |
[SQLD] TOP N Query (보강) (3) | 2024.03.01 |
[SQLD] 윈도우 함수 - ROW_NUMBER, PARTITION BY 예제 및 풀 (1) | 2024.02.27 |
SQL 집계함수 - SUM (0) | 2024.02.26 |