(동영상)오라클 피봇(PIVOT), 행을 열로 변경(Converting Rows Into Columns)

오라클11g 피봇(PIVOT), 행을 열로 변경(Converting Rows Into Columns)

 

-----------------------------------------------

-- ORACLE11g PIVOT 구

-- 행을 열로 변경(Converting Rows Into Columns)

-----------------------------------------------

 

-- ORACLE 11g 이후 사용가능 한 PIVOT구는 행을 열로 전환하는 구문으로

-- 이전 버전의 오라클에서 DECODE, CASE WHEN등을 이용하여 구현했던 방식을

-- 간단하게 구현하도록 지원한다.

 

--실습을 위한 EMP 테이블 이다.

 

select * from emp;

 

-- 부서(deptno)별, 직무(job)별로 사원수를 보는 쿼리를 작성해보자.

 

-- 1. 전통적인 방식 CASE WHEN절을 이용

SELECT d.dname, 

          COUNT( CASE job  WHEN 'CLERK'      THEN 1  END)   AS "CLERK" ,

          COUNT( CASE job  WHEN 'SALESMAN' THEN 1 END)    AS "SALESMAN" ,

          COUNT( CASE job  WHEN 'MANAGER'  THEN 1  END)   AS "MANAGER" ,

          COUNT( CASE job  WHEN 'ANALYST'   THEN 1   END)  AS "ANALYST" ,   

          COUNT( CASE job  WHEN 'PRESIDENT' THEN 1  END)   AS "PRESIDENT" 

FROM emp e, dept d

WHERE e.deptno IS NOT NULL

AND   e.deptno = d.deptno

GROUP BY d.dname

ORDER BY d.dname;

 

e90ff95623c054088ed36b188fe207a1_1596082
 

 

--2. 전통적인 방식 DECODE 이용

SELECT d.dname, 

          COUNT(DECODE( job, 'CLERK', 1 ))       AS "CLERK" ,

          COUNT(DECODE( job, 'SALESMAN', 1 ))  AS "SALESMAN" ,

          COUNT(DECODE( job, 'MANAGER', 1 ))   AS "MANAGER" ,

          COUNT(DECODE( job, 'ANALYST', 1 ))   AS "ANALYST" ,   

          COUNT(DECODE( job, 'PRESIDENT', 1 ))  AS "PRESIDENT" 

FROM emp e, dept d

WHERE e.deptno IS NOT NULL

AND   e.deptno = d.deptno

GROUP BY d.dname

ORDER BY d.dname;

 

e90ff95623c054088ed36b188fe207a1_1596082
 

 

--3. 오라클11g 이후 사용가능한 PIVOT 이용

SELECT *

FROM

  (

    SELECT d.dname, job

    FROM emp e, dept d

    WHERE e.deptno IS NOT NULL

    AND   e.deptno = d.deptno

  )

  -- PIVOT 구문은 PIVOT, PIVOT FOR, PIVOT IN 총 3개의 절이 필요하다.

  -- PIVOT 절에는  그룹함수가 적용된 컬럼을 정의한다. 여기서는 COUNT(*)

  -- FOR 절: PIVOT 기준컬럼을 정의한다. 여기서는 job

  -- IN 절: FOR절에서 정의한 컬럼(job)에서 필터링을 정의한다. 세로로 나올 칼럼들...

  PIVOT (

             COUNT(*) 

             FOR job 

             IN ('CLERK','SALESMAN','MANAGER','ANALYST','PRESIDENT')

          )

ORDER BY dname;

 

e90ff95623c054088ed36b188fe207a1_1596082
 

Comments