오라클(oracle) pivot, unpivot 함수 활용 예제 :: 개발/일상_Mr.lee

오라클(oracle) pivot, unpivot 함수 활용 예제

Posted by Mr.mandu.
2019. 11. 14. 11:16 개발/DB

안녕하세요.

오늘은 pivot, unpivot 함수를 정리해볼까 합니다.

pivot 함수는 row단위를column단위로 변경해주는 함수입니다.

unpivot 함수는 pivot의 역순이라고 생각하시면 됩니다.

예제를 통해 알아보겠습니다.


현재 테이블 현황 입니다.

직원 휴가 현황입니다.

제가 보고싶은 것은 월별 휴가현황을 보고싶습니다.


이때 pivot 함수를 활용하여 월별 휴가현황을 확인해 보겠습니다.


select * from (select user_nm, month, h_day from h_sts )
pivot
(
sum(h_day)
for month in (
  '1' as "1",
  '2' as "2",
  '3' as "3",
  '4' as "4",
  '5' as "5",
  '6' as "6",
  '7' as "7",
  '8' as "8",
  '9' as "9",
  '10' as "10",
  '11' as "11",
  '12' as "12"
  )
);

처음 select 부분의 * 이 부분의 컬럼은 아래의 in 절의 항목과, user_nm 입니다.

pivot 부분에 그룹함수를 적습니다.(확인하고자 하는 데이터)

저는 sum으로 했지만 count를 활용하여 개수를 체크하는데 사용하시면 됩니다.

for 부분에 그루핑을 할 칼럼 이름과 in 뒷부분에는 분류할 목록을 적어줍니다.

in절 뒷부분이 항목들로 활용됩니다.(컬럼)<--활용하다보면 계속 헷갈리네요


하면서 아직 헷갈리네요..

저도 제가 적은걸 보고 사용해야 할 것 같습니다.


위의 결과를 보시면 null값으로 출력되고 있습니다.

null 값을 다른 값으로 치환해보겠습니다.

아래의 쿼리 입니다.


select 
user_nm,
nvl("1",0) "1",
nvl("2",0) "2",
nvl("3",0) "3",
nvl("4",0) "4",
nvl("5",0) "5",
nvl("6",0) "6",
nvl("7",0) "7",
nvl("8",0) "8",
nvl("9",0) "9",
nvl("10",0) "10",
nvl("11",0) "11",
nvl("12",0) "12"
from (select user_nm, month, h_day from h_sts )
pivot
(
sum(h_day)
for month in (
  '1' as "1",
  '2' as "2",
  '3' as "3",
  '4' as "4",
  '5' as "5",
  '6' as "6",
  '7' as "7",
  '8' as "8",
  '9' as "9",
  '10' as "10",
  '11' as "11",
  '12' as "12"
  )
);

쿼리를 보시면 컬럼에 nvl 함수를 적용하였습니다.

"1", "2"~~ 이런것들이 컬럼으로 활용되고 있습니다.

적다보니 헷갈릴수 있다는 생각이 드네요.


unpivot은 pivot과 반대되는 개념 입니다.
가로로 나열된 정보를 다시 세로로 표시하는 기능으로 테스트를 위해서 
방금 pivot으로 바꾸었던 데이터들을 새로 만들어 보았습니다.

unpivot 테이블 현황 입니다.


테스트를위해 간단한 테이블을 만들었습니다.
바로 실사용 쿼리를 첨부하겠습니다.

select * from pivot_t
unpivot
(
h_day for month in (month_01,month_02,month_03,month_04,month_05,month_06,month_07,month_08,month_09,month_10,month_11,month_12)
)
;


결과 입니다.
사실 unpivot에 대한 활용이 자주 있을까라는 생각도 하지만
개념 정도 알고 있으면 좋을것 같습니다.
감사합니다.