[MSSQL] UNPIVOT 함수, 열을 행으로 바꾸기 (가로를 세로로)
- 데이터베이스/MSSQL
- 2021. 12. 21.
SQL Server에서 열(칼럼)을 행으로 바꾸기 위해서는 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 한 예제이다.
위의 예제를 조금 더 확장한 쿼리문이니 비교해보면 조금 더 이해하기 쉬울 것이다.