피벗(PIVOT)의 사전적 의미는 마찰을 적게 하기 위하여 회전하는 축의 지점 끝을 원뿔꼴로 한 것이다. 이 의미를 데이터베이스에서 나름 해석해보자면 테이블을 90도 회전 시켜 열을 행으로 바꿔버리는 그런 느낌의 의미라 할 수 있을 것이다.
DECLARE @COL AS NVARCHAR(MAX)
DECLARE @QUERY AS NVARCHAR(MAX)
SELECT * FROM SALE
SELECT DISTINCT
@COL = STUFF((
SELECT DISTINCT ',' + QUOTENAME(YYYYMM)
FROM SALE
FOR XML PATH('')
),1,1,'')
FROM SALE
SELECT @COL
SET @QUERY = 'SELECT * FROM
(
SELECT * FROM SALE
) AS RESULT
PIVOT( SUM(AMT) FOR YYYYMM IN ('+@COL+'))AS pivot_result'
EXECUTE(@QUERY)
우선 아래와 같이 SALE 테이블을 만들어보자
다 만들었으면 아래와 같이 코드를 만들고 실행하여 보자
SELECT DISTINCT
@COL = STUFF((
SELECT DISTINCT ',' + QUOTENAME(YYYYMM)
FROM SALE
FOR XML PATH('')
),1,1,'')
FROM SALE
SELECT @COL
위 이미지와 같은 결과가 나타나게된다. 위의 결과를 자세히 살펴보면 YYYYMM 속성의 값들이 중복 없이 일열로 나열된 것을 확인할 수 있다. 이를 위해서 STUFF((쿼리문 FOR XML PATH('') ),1,1,'')을 활용하면 된다.
STUFF에 관해 구체적으로 궁금하다면 아래 사이트를 참조하길 바란다.
[MSSQL] STUFF와 FOR XML PATH를 활용한 문자열 합치기 (tistory.com)
[MSSQL] STUFF와 FOR XML PATH를 활용한 문자열 합치기
MSSQL에서 문자열을 합치는 방법은 여러가지가 있습니다. 이번 포스팅에서는 테이블을 Select 해온 결과값을 문자열로 쉽고 간편하게 만들 수 있는 방법을 소개해 드리도록 하겠습니다. STUFF, FOR XML
coding-factory.tistory.com
그리고 아직 설명하지 않은 QUOTENAME()이 남아있다. QUOTENAME()이 어떤 기능을 가졌는지 이해하기 위해서 우선 QUOTENAME을 없애고 위의 코드를 실행시키면 아래와 같이 [] 대괄호가 사라진 것을 확인할 수 있다. 이 사실로 미루어 보아 QUOTENAME이 대괄호를 만들어주는 역할을 수행하는 것을 알 수 있지만 왜 필요한지 의문이 들 수 있다. 어느 블로그에서 확인한 바로는 피벗 테이블에서 속성으로 만들어주기 위해서는 MSSQL에서는 대괄호로 감싸져 있어야 한다고 한다.
이제 아래와 같이 피벗 테이블을 만들어주는 쿼리문을 작성하여 보자.
SET @QUERY = 'SELECT * FROM
(
SELECT * FROM SALE
) AS RESULT
PIVOT( SUM(AMT) FOR YYYYMM IN ('+@COL+'))AS pivot_result'
EXECUTE(@QUERY)
피벗 테이블의 일반적인 구조는 아래와 같다.
SELECT *
FROM (SELECT * FROM 피벗을 원하는 테이블) AS RESULT
PIVOT ( 그룹함수(집계컬럼) FOR 피벗대상컬럼 IN ([피벗컬럼값], ...) AS PIVOT_RESULT
일반 테이블을 피벗 테이블로 완성시킨 모습
PIVOT에 대해 추가적으로 학습하고 싶다면 아래의 블로그를 활용하길 바란다.
[MSSQL] PIVOT 함수, 행을 열로 바꾸기 (크로스탭, 동적컬럼) (tistory.com)
[MSSQL] PIVOT 함수, 행을 열로 바꾸기 (크로스탭, 동적컬럼)
SQL Server에서 행을 열로 변환하기 위해서는 PIVOT() 함수를 이용하면 된다. 특히 그룹함수를 이용하여 통계를 추출할 때 많이 사용된다. SELECT * FROM ( 피벗할 쿼리문 ) AS result PIVOT ( 그룹합수(집계
gent.tistory.com
'Database' 카테고리의 다른 글
MySQL의 GROUP_CONCAT 함수: 여러 값을 하나의 문자열로 결합하기 (0) | 2024.08.23 |
---|---|
기존 테이블에 속성 추가 (0) | 2021.11.11 |
mssql - ISNULL, IN, Procedure (0) | 2021.01.18 |
mssql - join, between, like '%' (0) | 2021.01.18 |