Verimli bir şekilde sql server sütun için satır dönüştürmek
Etkili bir çözüm için SQL server sütun için satır dönüştürmek için arıyorum, bu ÖZET çok hızlı değil duydum, ve kayıtların çok uğraşmak lazım.
Bu benim örnek:
Id Value ColumnName
1 John FirstName
2 2.4 Amount
3 ZH1E4A PostalCode
4 Fork LastName
5 857685 AccountNumber
Bu benim sonuç:
FirstName Amount PostalCode LastName AccountNumber
John 2.4 ZH1E4A Fork 857685
Bu sonucu nasıl inşa edebilirim?
CEVAP
Sütun birden fazla satır verileri dönüştürmek için çeşitli yollar vardır. SQL Server PIVOT
işlevi sütun için satır verileri dönüştürmek için kullanabilirsiniz:
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;
SQL Fiddle with Demo bkz.
Eğer sırasını değiştirmek istediğiniz columnnames
sayısı bilinmeyen varsa, o zaman dinamik SQL kullanabilirsiniz:
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;
SQL Fiddle with Demo bkz.
Eğer PIVOT
Bu fonksiyonu kullanmak istiyorsanız, o zaman CASE
bir ifade ile bir toplama işlevi kullanabilirsiniz:
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
SQL Fiddle with Demo bkz.
Bu da tamamlanmış kullanarak birden fazla birleşim olabilir, ama örnek veri yok satırların her ilişkilendirmek için bazı sütun gerekir. Ama temel sözdizimi olacaktır:
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'
Nasıl bir sütun değeri tekrarlarını SQ...
Nasıl'zaman damgası sütun biçimi ...
Nasıl Server tablo sütun olup olmadığı...
Nasıl verimli bir şekilde anahtarları/...
Bir sütun için Max değerine sahip geti...