여러 행의 데이터를 열로 변환 할 수있는 여러 가지 방법이 있습니다. SQL 서버에서는 컬럼에 행에서 데이터를 변환하기 위해 PIVOT
기능을 사용할 수 있습니다 :
select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
select value, columnname
from yourtable
) d
pivot
(
max(value)
for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;
이 Demo를 참조하십시오.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName)
from yourtable
group by ColumnName, id
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select value, ColumnName
from yourtable
) x
pivot
(
max(value)
for ColumnName in (' + @cols + N')
) p '
exec sp_executesql @query;
이 Demo를 참조하십시오 : 당신은 당신이 트랜스 할 columnnames
의 알 수없는 번호가있는 경우
는, 당신은 동적 SQL을 사용할 수 있습니다.
select
max(case when columnname = 'FirstName' then value end) Firstname,
max(case when columnname = 'Amount' then value end) Amount,
max(case when columnname = 'PostalCode' then value end) PostalCode,
max(case when columnname = 'LastName' then value end) LastName,
max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable
이 Demo를 참조하십시오 : 당신이 PIVOT
기능을 사용하지 않으려면
, 그럼 당신은 CASE
표현으로 집계 함수를 사용할 수 있습니다.
여러 조인을 사용하여 완료 할 수도 있지만 샘플 데이터에없는 각 행을 연결하려면 일부 열이 필요합니다. 하지만 기본 구문은 다음과 같습니다.
select fn.value as FirstName,
a.value as Amount,
pc.value as PostalCode,
ln.value as LastName,
an.value as AccountNumber
from yourtable fn
left join yourtable a
on fn.somecol = a.somecol
and a.columnname = 'Amount'
left join yourtable pc
on fn.somecol = pc.somecol
and pc.columnname = 'PostalCode'
left join yourtable ln
on fn.somecol = ln.somecol
and ln.columnname = 'LastName'
left join yourtable an
on fn.somecol = an.somecol
and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'
+1. . . 그러나 마지막 예제에서는 각 하위 쿼리가 하나의 행을 반환하기 때문에'left join '대신'cross join '을 사용할 수 있습니다. –
행의 수를 모르기 때문에 동적 쿼리를 작성해야합니다. 10.000으로 테이블을 변환하는 것에 대해 이야기 해 보겠습니다.000 수백만 레코드 – tbag
@tbag 알 수없는 행 수가있는 경우 동적 SQL을 사용해야하지만 수백만 행을 변환하는 것이 효율적이지는 않습니다. – Taryn