[Oracle] 오라클 PIVOT(피벗) 함수 사용법 (행을 열로 변환, 피봇)
- 데이터베이스/오라클
- 2014. 12. 26.
오라클 11g부터 PIVOT 기능을 제공합니다.
기존 이하버전에서는 DECODE 함수를 이용하여 로우를 컬럼으로 변경하는 작업을 하였습니다.
PIVOT 기능을 이용하면 DECODE의 복잡하고 비직관적인 코드를 조금 더 직관적으로 작성할 수 있습니다.
아쉬운 접은 PIVOT 기능을 사용하더라도 PIVOT을 할 컬럼을 미리 정의를 해 놓아야 한다는 점이다.
상황에 맞게 PIVOT를 사용할지 DECODE를 사용할지 결정해서 사용하면 될꺼 같습니다.
SELECT * |
PIVOT 사용법
직군별, 월별 입사 건수
SELECT *
FROM (
SELECT job , TO_CHAR(hiredate, 'FMMM') || '월' hire_month
FROM emp
)
PIVOT (
COUNT(*)
FOR hire_month IN ('1월', '2월', '3월', '4월', '5월', '6월',
'7월', '8월', '9월', '10월', '11월', '12월')
)
피벗 컬럼 값(1월, 2월, 3월 ...)은 한번 지정하면 해당 값이 존재하지 않아도 해당 컬럼이 표시된다.
기본적인 방법으로 피벗 컬럼 값을 동적으로 바꿀 수는 없다. 해당 값을 동적으로 바꾸기 위해서는 동적 쿼리 등 다른 편법을 사용해야 한다.
TO_CHAR('2020-09-16', 'MM') → '09'
TO_CHAR('2020-09-16', 'FMMM') → '9'
직군별, 부서코드별 급여 합계 (피벗컬럼 별칭 사용)
SELECT job
, d1
, d2
, d3
FROM (
SELECT job
, deptno
, sal
FROM emp
)
PIVOT (
SUM(sal) FOR deptno IN ('10' AS d1, '20' AS d2, '30' AS d3)
)
피벗 컬럼 값에 별칭(d1, d2, d3 ...)을 지정하면 SELECT 절에서 해당 별칭을 컬럼처럼 사용할 수 있다.
DECODE 사용법 (10g 이하 버전)
직군별, 월별 입사 건수
SELECT job
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '1', 1, 0)) "1월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '2', 1, 0)) "2월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '3', 1, 0)) "3월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '4', 1, 0)) "4월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '5', 1, 0)) "5월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '6', 1, 0)) "6월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '7', 1, 0)) "7월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '8', 1, 0)) "8월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '9', 1, 0)) "9월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '10', 1, 0)) "10월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '11', 1, 0)) "11월"
, SUM(DECODE(TO_CHAR(hiredate, 'FMMM'), '12', 1, 0)) "12월"
FROM emp
GROUP BY job
오라클 10g 이하 버전에서는 PIVOT 함수를 사용할 수 없으므로 DECODE 함수를 사용하여 행을 열로 변환이 가능하다.
사용 예제
|
|
|