[Oracle] 데이터 그룹화(6) - PIVOT(), UNPIVOT()
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다. Java(TM) 플랫폼 : 1.8.0_321 Oracle IDE : 4.1.5.21.78 |
PIVOT(), UNPIVOT()
설명
PIVOT() : 오라클 11g 버전부터 사용 가능한 함수. 기존 테이블 행을 열로 바꾸어 출력
UNPIVOT() : 오라클 11g 버전부터 사용 가능한 함수. 기존 테이블 열을 행으로 바꾸어 출력
사용 예시
-- query1(부서별/직책별로 그룹화하여 최고 급여 데이터 출력하기)
SELECT DEPTNO, JOB, MAX(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
-- query2(PIVOT() 함수를 사용하여 부서별/직책별 최고 급여를 2차원 표 형태로 출력하기1)
SELECT *
FROM (SELECT DEPTNO, JOB, SAL
FROM EMP)
PIVOT (MAX(SAL) FOR DEPTNO IN (10, 20, 30))
ORDER BY JOB;
-- query3(PIVOT() 함수를 사용하여 부서별/직책별 최고 급여를 2차원 표 형태로 출력하기2)
SELECT *
FROM (SELECT JOB, DEPTNO, SAL
FROM EMP)
PIVOT (MAX(SAL)
FOR JOB IN ('CLERK' AS CLERK
, 'SALESMAN' AS SALESMAN
, 'PRESIDENT' AS PRESIDENT
, 'MANAGER' AS MANAGER
, 'ANALYST' AS ANALYST)
)
ORDER BY DEPTNO;
-- query4(오라클 11g 이전 버전, PIVOT() 함수를 사용할 수 없을 경우)
SELECT DEPTNO
, MAX(DECODE(JOB, 'CLERK', SAL)) AS "CLERK"
, MAX(DECODE(JOB, 'SALESMAN', SAL)) AS "SALESMAN"
, MAX(DECODE(JOB, 'PRESIDENT', SAL)) AS "PRESIDENT"
, MAX(DECODE(JOB, 'MANAGER', SAL)) AS "MANAGER"
, MAX(DECODE(JOB, 'ANALYST', SAL)) AS "ANALYST"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
-- query5(UNPIVOT() 함수를 사용하여 열로 구분된 그룹을 행으로 출력하기)
SELECT *
FROM (SELECT DEPTNO
, MAX(DECODE(JOB, 'CLERK', SAL)) AS "CLERK"
, MAX(DECODE(JOB, 'SALESMAN', SAL)) AS "SALESMAN"
, MAX(DECODE(JOB, 'PRESIDENT', SAL)) AS "PRESIDENT"
, MAX(DECODE(JOB, 'MANAGER', SAL)) AS "MANAGER"
, MAX(DECODE(JOB, 'ANALYST', SAL)) AS "ANALYST"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO)
UNPIVOT (
SAL FOR JOB IN (CLERK, SALESMAN, PRESIDENT, MANAGER, ANALYST))
ORDER BY DEPTNO, JOB;
결과
-- query1(부서별/직책별로 그룹화하여 최고 급여 데이터 출력하기)
SELECT DEPTNO, JOB, MAX(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
-- query2(PIVOT() 함수를 사용하여 부서별/직책별 최고 급여를 2차원 표 형태로 출력하기1)
SELECT *
FROM (SELECT DEPTNO, JOB, SAL
FROM EMP)
PIVOT (MAX(SAL) FOR DEPTNO IN (10, 20, 30))
ORDER BY JOB;
-- query3(PIVOT() 함수를 사용하여 부서별/직책별 최고 급여를 2차원 표 형태로 출력하기2)
SELECT *
FROM (SELECT JOB, DEPTNO, SAL
FROM EMP)
PIVOT (MAX(SAL)
FOR JOB IN ('CLERK' AS CLERK
, 'SALESMAN' AS SALESMAN
, 'PRESIDENT' AS PRESIDENT
, 'MANAGER' AS MANAGER
, 'ANALYST' AS ANALYST)
)
ORDER BY DEPTNO;
-- query4(오라클 11g 이전 버전, PIVOT() 함수를 사용할 수 없을 경우)
SELECT DEPTNO
, MAX(DECODE(JOB, 'CLERK', SAL)) AS "CLERK"
, MAX(DECODE(JOB, 'SALESMAN', SAL)) AS "SALESMAN"
, MAX(DECODE(JOB, 'PRESIDENT', SAL)) AS "PRESIDENT"
, MAX(DECODE(JOB, 'MANAGER', SAL)) AS "MANAGER"
, MAX(DECODE(JOB, 'ANALYST', SAL)) AS "ANALYST"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
-- query5(UNPIVOT() 함수를 사용하여 열로 구분된 그룹을 행으로 출력하기)
SELECT *
FROM (SELECT DEPTNO
, MAX(DECODE(JOB, 'CLERK', SAL)) AS "CLERK"
, MAX(DECODE(JOB, 'SALESMAN', SAL)) AS "SALESMAN"
, MAX(DECODE(JOB, 'PRESIDENT', SAL)) AS "PRESIDENT"
, MAX(DECODE(JOB, 'MANAGER', SAL)) AS "MANAGER"
, MAX(DECODE(JOB, 'ANALYST', SAL)) AS "ANALYST"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO)
UNPIVOT (
SAL FOR JOB IN (CLERK, SALESMAN, PRESIDENT, MANAGER, ANALYST))
ORDER BY DEPTNO, JOB;