본문 바로가기
  • [성공하는 개발자] - Developer
DataBase/MSSQL

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

by 세인보이 2023. 4. 4.
728x90

 

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 한 예제이다. 

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

728x90