2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
Pivot 명령어를 수행하기 전/후의 데이터 형태에서 대해서 인지하도록 합시다. 피벗 시 alias를 줄 수 있으나 필수는 아닙니다.
Sytax는 아래와 같습니다. (최상단의 select를 유의해주세요)
SELECT * FROM (피벗 할 쿼리문)
PIVOT(
그룹함수(칼럼)
FOR 피벗 할 칼럼
IN (항목1, 항목2, 항목3 ...)
);
예를 들어 아래와 같은 데이터가 있다고 해보겠습니다.
지금 sales라는 (Tableau 용어로 치면) 측정값이 "행 차원"에서 YEAR, REGION이라는 세부레벨로 구분된 상태입니다. 이제 우리가 하고싶은 PIVOT이란 행차원에 있던 하나의 세부레벨을 "열 차원"으로 옮겨서 표현하고 싶은 겁니다. 여기서는 REGION을 열차원으로 옮기고 싶다고 해보겠습니다. 그러면 이렇게 한 세부레벨을 열로 이동시키면서 남은 차원(여기서는 YEAR)도 집계를 해주어야 표현이 가능합니다. (왜냐하면 원래는 REGION별로 쪼개져서 표현되어 있던 것을 다 같이 합쳐서 표현해야 하니..)
ref) 이렇게 남아있는 기준(여기서는 YEAR) Grouping하는 기준은 암묵적으로 정해집니다. 여기서 제가 YEAR라는 것으로 grouping하라고 명시적으로 명령해 준 부분은 없지만 오라클이 알아서 그룹핑 기준을 선택해서 진행했습니다.
한번만 예시에 대해서 정리해보자면
원래 데이터에서 세부레벨 YEAR, REGION에 대해 SALES 데이터가 입력되어 있었는데
- 여기서 REGION이라는 세부레벨을 칼럼으로 빼면서
- SALES라는 집계대상을 집계한 값을
- YEAR라는 grouping 기준 행으로 표현한 것이 PIVOT 명령어 입니다.
그래서 최소한 빼내고자 하는 세부레벨, 집계대상, Grouping 기준이 있어야 PIVOT을 할 수 있겠죠?
SELECT *
FROM (
SELECT YEAR, REGION, SALES
FROM sales
)
PIVOT (
SUM(SALES) -- 집계 함수
FOR REGION IN ('East' AS EAST, 'West' AS WEST, 'North' AS NORTH)
);
결과는 아래와 같습니다.
PIVOT을 진행할 때, sales처럼 수치적인 값만 적용할 수 있는 것은 아닙니다. Hackerrank의 아래 문제를 보실까요?
https://www.hackerrank.com/challenges/occupations/problem?isFullScreen=true
Occupations | HackerRank
Pivot the Occupation column so the Name of each person in OCCUPATIONS is displayed underneath their respective Occupation.
www.hackerrank.com
여기서는 집계 대상이 어떤 수치적 정보가 아니라 Name이라는 이름입니다. 이 문제에서 주목할 만한 다른 점은 Grouping 기준이 처음부터 존재하는 것은 아니기에 직접생성해주어야 한다는 것입니다.
select Doctor, Professor, Singer, Actor from (
select Name, Occupation, Row_number() over (partition by Occupation order by Name) rn
from occupations)
PIVOT(
max(Name) for Occupation in ('Doctor' as Doctor, 'Professor' as Professor, 'Singer' as Singer, 'Actor' as Actor)
) order by rn;
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL 기초] ROWNUM(혹은 LIMIT) (2) | 2025.01.18 |
---|---|
[SQL 기초] Length함수 (0) | 2025.01.18 |
[SQL 기초] Union/Union all (0) | 2025.01.09 |
[SQL - Frequently Used Code] 제수가 0입니다 (2) | 2024.12.19 |
[DBeaver] 테마 변경하기 (0) | 2024.12.19 |