UNPIVOT
정규화되지 않은 데이터에 함수를 적용 할 때 SQL Server에서는 데이터 형식과 길이가 같아야합니다. 데이터 유형이 동일해야하는 이유를 이해하지만 UNPIVOT에서 길이가 동일해야하는 이유는 무엇입니까?
피벗 해제해야하는 다음 샘플 데이터가 있다고 가정하겠습니다.
CREATE TABLE People
(
PersonId int,
Firstname varchar(50),
Lastname varchar(25)
)
INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
UNPIVOT을 시도하면 Firstname
및 Lastname
열이 다음과 유사합니다.
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server는 오류를 생성합니다.
메시지 8167, 수준 16, 상태 1, 줄 6
열 "성"유형이 UNPIVOT 목록에 지정된 다른 열 유형과 충돌합니다.
오류를 해결하려면 하위 쿼리를 사용하여 먼저 Lastname
열을 다음과 같은 길이로 캐스트 해야합니다 Firstname
.
select PersonId, ColumnName, Value
from
(
select personid,
firstname,
cast(lastname as varchar(50)) lastname
from People
) d
unpivot
(
Value FOR
ColumnName in (FirstName, LastName)
) unpiv;
UNPIVOT이 SQL Server 2005에 도입되기 전에 SELECT
with UNION ALL
를 사용 하여 firstname
/ lastname
열 을 피벗 해제 하고 열을 동일한 길이로 변환하지 않고도 쿼리를 실행했습니다.
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Demo with SQL Fiddle을 참조하십시오 .
또한 CROSS APPLY
데이터 유형에서 길이가 동일하지 않은 데이터를 사용하여 데이터를 성공적으로 피봇 해제 할 수 있습니다 .
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Demo with SQL Fiddle을 참조하십시오 .
MSDN을 읽었지만 데이터 유형의 길이를 동일하게 강제하는 이유를 설명하는 것을 찾지 못했습니다.
UNPIVOT을 사용할 때 동일한 길이를 요구하는 논리는 무엇입니까?