SORU
1 NİSAN 2013, PAZARTESİ


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
1 NİSAN 2013, PAZARTESİ


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'

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • PomplamooseMusic

    PomplamooseM

    28 HAZİRAN 2008