[Oracle SQL] 가로 세로 Pivot ? (ft. 돌려 돌려 돌림판)

Pivot ... 엑셀... 아시죠 ?

  • 세로로 쌓은 데이터를 가로로 펼쳐서 보여줘야 하는 경우가 종종 발생할 때 사용
  • 엑셀의 pivot table과 크게 다르지 않아요

예시

MONTH CATEGORY AMOUNT
1 식품 100
1 의류 200
2 식품 150
2 의류 300
SELECT *
FROM (
  SELECT  MONTH
          , CATEGORY
        , AMOUNT
  FROM COMPANY_OUTPUT
)
PIVOT (
  SUM(AMOUNT)
  FOR CATEGORY IN (
                        '식품' AS FOOD
                    , '의류' AS CLOTHES
                  )
);
MONTH FOOD CLOTHES
1 100 200
2 150 300

pivot 사용법 (행의 값을 열의 값으로, 돌려 돌려 돌림판)

SELECT *
FROM (
SELECT [피벗에 사용할 컬럼들] -- select 문으로 우선 피벗으로 바꿀 컬럼 호출
FROM [테이블명]
)
PIVOT (
[집계함수]([집계할 컬럼]) -- 연산 및 연산 할 컬럼
FOR [피벗 기준 컬럼] -- 피벗에 넣을 컬럼
IN ([가로로 펼칠 값들]) -- 헤더에 보여 줄 컬럼
);
주의사항

  • IN 절 안에 값은 미리 알아야함 (즉각적으로 바꿔치기 그런거 안 됨)
  • 즉 서브쿼리에서 데이터를 최대한 가공해야함

unpivot 사용법 (열의 값을 행의 값으로, 돌려 돌려 돌림판)

SELECT *
FROM (
  SELECT MONTH, FOOD, CLOTHES
  FROM (
    SELECT  MONTH,
            CATEGORY,
            AMOUNT
    FROM COMPANY_OUTPUT
  )
  PIVOT (
    SUM(AMOUNT)
    FOR CATEGORY IN (
      '식품' AS FOOD,
      '의류' AS CLOTHES
    )
  )
)
UNPIVOT (
  AMOUNT FOR CATEGORY IN (
                                FOOD AS '식품'
                            , CLOTHES AS '의류'
                         )
);

UNPIVOT (
[데이터 컬럼] FOR [카테고리 컬럼] IN (
[컬럼1] AS '이름1'
, [컬럼2] AS '이름2'
)
);

주의사항

  • 되돌리는 과정에서 null 이 있으면 null 그대로 보여줌 (where 로 정리해야함)