[MSSQL] UNPIVOT 함수, 열을 행으로 바꾸기 (가로를 세로로)

SQL Server에서 열(칼럼)을 행으로 바꾸기 위해서는 UNPIVOT을 사용하면 된다. 가로의 칼럼을 세로의 행으로 바꾼다고 생각하면 된다. 자주 사용하지는 않지만 개념을 이해하고 있으면 한 번쯤은 필요할 때가 있다.

 

MSSQL UNPIVOT 함수

 

SELECT *
  FROM ( 대상테이블 or 서브쿼리 ) AS tab
 UNPIVOT ( 집계값칼럼명 FOR UNPIVOT대상칼럼명 IN ([UNPIVOT할칼럼명] ... ) AS unpvt

 

UNPIVOT 사용법

 WITH sal_stat(job, D_10, D_20, D_30) AS 
 (
    SELECT 'ANALYST',      0, 6000,    0 UNION ALL
    SELECT 'CLERK',     1300, 1900,  950 UNION ALL
    SELECT 'MANAGER',   2450, 2975, 2850 UNION ALL
    SELECT 'PRESIDENT', 5000, 2975, 2850 UNION ALL
    SELECT 'SALESMAN',     0,    0, 5600
 )

 SELECT job 
      , dept
      , sal
   FROM sal_stat
UNPIVOT (sal FOR dept IN ([D_10], [D_20], [D_30])) AS unpivot_result
  ORDER BY job, dept

 

 

sal : 집계 값을 표시할 새로운 칼럼명 (임의로 새로운 명칭을 부여하면 됨)

dept : UNPIVOT 할 칼럼명을 표시할 새로운 칼럼명 (임의로 새로운 명칭을 부여하면 됨)

([D_10], [D_20], [D_20]) : 기존 테이블에서 UNPIVOT 할 칼럼명을 지정

 

각 직군별(job)로 UNPIVOT 된 칼럼 수만큼 행이 늘어난 것을 확인할 수 있다.

 

 SELECT job
      , emp_cnt
   FROM (
          SELECT SUM(CASE WHEN job = 'ANALYST' THEN 1 END) AS ANALYST
               , SUM(CASE WHEN job = 'MANAGER' THEN 1 END) AS MANAGER
               , SUM(CASE WHEN job = 'SALESMAN' THEN 1 END) AS SALESMAN
            FROM emp
        ) AS job_stat
UNPIVOT (emp_cnt FOR job IN ([ANALYST], [MANAGER], [SALESMAN])) AS unpivot_result

 

 

emp_cnt : 값을 표시할 칼럼명 지정 (임의로 새로운 명칭을 부여하면 됨) 

job : UNPIVOT 열명을 표시할 칼럼명 지정 (임의로 새로운 명칭을 부여하면 됨)

 

위의 예제는 서브쿼리(인라인 뷰)의 결과를 UNPIVOT 한 예제이다.

서브 쿼리의 별칭(AS job_stat)과 UNPIVOT의 별칭(AS unpivot_result)는 꼭 지정해야 오류가 발생하지 않는다.

 

 SELECT deptno
      , job
      , emp_cnt
   FROM (
          SELECT deptno
               , SUM(CASE WHEN job = 'ANALYST' THEN 1 ELSE 0 END) AS ANALYST
               , SUM(CASE WHEN job = 'MANAGER' THEN 1 ELSE 0 END) AS MANAGER
               , SUM(CASE WHEN job = 'SALESMAN' THEN 1 ELSE 0 END) AS SALESMAN
            FROM emp
           GROUP BY deptno
        ) AS dept_stat
UNPIVOT (emp_cnt FOR job IN ([ANALYST], [MANAGER], [SALESMAN])) AS unpivot_result

 

 

부서코드(deptno), 직군(job)로 집계된 결과를 UNPIVOT 한 예제이다. 

위의 예제를 조금 더 확장한 쿼리문이니 비교해보면 조금 더 이해하기 쉬울 것이다.

 

예제쿼리(테이블포함).txt
0.01MB

 

 

[MSSQL] PIVOT 함수, 행을 열로 바꾸기 (크로스탭, 동적컬럼)

SQL Server에서 행을 열로 변환하기 위해서는 PIVOT() 함수를 이용하면 된다. 특히 그룹함수를 이용하여 통계를 추출할 때 많이 사용된다. SELECT * FROM ( 피벗할 쿼리문 ) AS result  PIVOT ( 그룹합수(집계

gent.tistory.com

 

 

댓글

Designed by JB FACTORY