티스토리 뷰
728x90
PIVOT 구문은 ROW로 출력된 결과를 COLUMN으로 변환시키는 역할을 한다.
예를 들어, 아래 쿼리는 연도별, 주문ID별, 주문수량의 합계를 출력한다.
결과를 보면 주문ID별로 2011, 2012, 2013, 2014 이렇게 4개의 ROW로 출력되어 한 눈에 확인이 어려운 느낌이다.
SELECT CONVERT(VARCHAR(4), DueDate, 112) [DueYEAR]
, LEFT(PurchaseOrderID,1) [PurchaseOrderID]
, SUM(OrderQty) [OrderQty]
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
, LEFT(PurchaseOrderID,1)
ORDER BY LEFT(PurchaseOrderID,1)
이 때, PIVOT 구문을 사용한다면 연도컬럼이 ROW가 아닌 COLUMN으로 변환되어 아래처럼 출력이 가능하다.
SELECT *
FROM (
SELECT CONVERT(VARCHAR(4), DueDate, 112) [DueYEAR]
, LEFT(PurchaseOrderID,1) [PurchaseOrderID]
, SUM(OrderQty) [OrderQty]
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
, LEFT(PurchaseOrderID,1)
) A
PIVOT (SUM(OrderQty) FOR DueYEAR IN ([2011], [2012], [2013], [2014])) AS PVT;
반대로 주문ID를 COLUMN으로 변경하는 것도 가능하다.
SELECT *
FROM (
SELECT CONVERT(VARCHAR(4), DueDate, 112) [DueYEAR]
, LEFT(PurchaseOrderID,1) [PurchaseOrderID]
, SUM(OrderQty) [OrderQty]
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
, LEFT(PurchaseOrderID,1)
) A
PIVOT (SUM(OrderQty) FOR PurchaseOrderID IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])) AS PVT;
반대로 PIVOT된 테이블을 UNPIVOT도 가능하다
--UNPIVOT
SELECT *
INTO #UNPIVOT
FROM (
SELECT CONVERT(VARCHAR(4), DueDate, 112) [DueYEAR]
, LEFT(PurchaseOrderID,1) [PurchaseOrderID]
, SUM(OrderQty) [OrderQty]
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
, LEFT(PurchaseOrderID,1)
) A
PIVOT (SUM(OrderQty) FOR DueYEAR IN ([2011], [2012], [2013], [2014])) AS PVT;
SELECT * FROM #UNPIVOT
SELECT *
FROM #UNPIVOT
UNPIVOT (OrderQty FOR DueYEAR IN ([2011], [2012], [2013], [2014])) AS UPVT;
PIVOT 구문을 사용할 때 COLUMN이 되는 값은 정해져 있지 않기 때문에 위의 예처럼 값을 지정하는 것은 실제로 사용하기가 쉽지 않다. 아래처럼 해당되는 COLUMN 값을 미리 변수에 지정하여 dynamic하게 사용이 가능하다.
DECLARE @COL NVARCHAR(MAX) = ''
, @SQL NVARCHAR(MAX) = ''
SELECT @COL += QUOTENAME(CONVERT(VARCHAR(4), DueDate, 112)) + ','
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
SET @COL = LEFT(@COL, LEN(@COL) - 1)
SELECT @COL
SET @SQL = '
SELECT *
FROM (
SELECT CONVERT(VARCHAR(4), DueDate, 112) [DueYEAR]
, LEFT(PurchaseOrderID,1) [PurchaseOrderID]
, SUM(OrderQty) [OrderQty]
FROM [AdventureWorks2014].[Purchasing].[PurchaseOrderDetail]
GROUP BY CONVERT(VARCHAR(4), DueDate, 112)
, LEFT(PurchaseOrderID,1)
) A
PIVOT (
SUM(OrderQty) FOR DueYEAR IN (' + @COL + ')
) AS PVT;'
EXECUTE sp_executesql @SQL;
728x90
LIST
'Programming > MS SQL Server' 카테고리의 다른 글
[MS SQL SERVER] SEQUENCE (0) | 2021.10.28 |
---|---|
[MS SQL SERVER] IDENTITY() (0) | 2021.10.28 |
[MS SQL SERVER] MERGE (0) | 2021.10.28 |
[MS SQL SERVER] INSERT - OUTPUT 구문 (0) | 2021.10.28 |
[MS SQL SERVER] UNION, UNION ALL, INTERSECT, EXCEPT (0) | 2021.10.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 대원화성
- tensorflow
- 동국알앤에스
- string
- 분석탭
- 테슬라
- 경구치료제
- 해커랭크
- 넷플릭스
- TSQL
- hackerrank
- SQL Server
- HK이노엔
- DATABASE
- mysql
- MS SQL Server
- python
- 미중무역전쟁
- 매매일지
- Tableau
- MSSQL
- Weather Observation Station
- 몰누피라비르
- 리비안
- list
- python3
- 코로나19
- insert
- 넥스트BT
- 에코캡
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함