이 게시물은 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;
'개발 지식 > [DBMS] Oracle' 카테고리의 다른 글
[Oracle] JOIN(2) - 내부 조인(INNER JOIN) (0) | 2022.05.29 |
---|---|
[Oracle] JOIN(1) - JOIN의 기본 개념과 목적 (0) | 2022.05.28 |
[Oracle] 데이터 그룹화(5) - LISTAGG() (0) | 2022.05.26 |
[Oracle] 데이터 그룹화(4) - GROUPING(), GROUPING_ID() (0) | 2022.05.25 |
[Oracle] 데이터 그룹화(3) - GROUPING SETS() (0) | 2022.05.24 |