이 데이터를 변환 할 수있는 몇 가지 방법이 있습니다. 원래 게시물 PIVOT
에서이 시나리오에는 너무 복잡해 보이지만 SQL Server 의 UNPIVOT
및PIVOT
함수 를 모두 사용하여 매우 쉽게 적용 할 수 있다고 언급했습니다 .
그러나이 사용하고 복제 할 수있는 그 기능에 액세스 할 수없는 경우 UNION ALL
에 UNPIVOT
A를 집계 함수 다음과 CASE
문을 PIVOT
:
테이블 생성 :
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
Union All, Aggregate 및 CASE 버전 :
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
데모로 SQL Fiddle 보기
UNION ALL
행하는 UNPIVOT
열을 변환하여 상기 데이터의 Paul, John, Tim, Eric
개별 행에. 그럼 당신은 집계 함수를 적용 sum()
과 case
각각에 대한 새 열을 얻을 문 color
.
Unpivot 및 Pivot 정적 버전 :
SQL 서버 의 UNPIVOT
및 PIVOT
함수는이 변환을 훨씬 쉽게 만듭니다. 변환하려는 모든 값을 알고있는 경우 해당 값을 정적 버전으로 하드 코딩하여 결과를 얻을 수 있습니다.
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
데모로 SQL Fiddle 보기
이있는 내부 쿼리 UNPIVOT
는 UNION ALL
. 열 목록을 가져 와서 행으로 PIVOT
변환 한 다음 최종 변환을 열로 수행합니다.
동적 피벗 버전 :
알 수없는 수의 열이 있고 ( Paul, John, Tim, Eric
예시의 경우) 변환 할 색상 수를 알 수없는 경우 동적 SQL을 사용하여 목록을 생성 UNPIVOT
한 다음 다음 을 수행 할 수 있습니다 PIVOT
.
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
데모로 SQL Fiddle 보기
동적 버전 모두를 쿼리 yourtable
하고 sys.columns
테이블에 항목의 목록 생성 UNPIVOT
및 PIVOT
. 그런 다음 실행될 쿼리 문자열에 추가됩니다. 동적 버전의 장점은 변경 목록 이 colors
있거나 names
런타임에 목록을 생성하는 경우입니다.
세 가지 쿼리 모두 동일한 결과를 생성합니다.
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |