Efficiently convert rows to columns in sql server -
i'm looking efficient way convert rows columns in sql server, heard pivot not fast, , need deal lot of records.
this example:
id value columnname 1 john firstname 2 2.4 amount 3 zh1e4a postalcode 4 fork lastname 5 857685 accountnumber this result:
firstname amount postalcode lastname accountnumber john 2.4 zh1e4a fork 857685 how can build result?
there several ways can transform data multiple rows columns. in sql server can use pivot function transform data rows columns:
select firstname, amount, postalcode, lastname, accountnumber ( select value, columnname yourtable ) d pivot ( max(value) columnname in (firstname, amount, postalcode, lastname, accountnumber) ) piv; see demo.
if have unknown number of columnnames want transpose, can use dynamic sql:
declare @cols nvarchar(max), @query nvarchar(max) select @cols = stuff((select ',' + quotename(columnname) yourtable group columnname, id order id xml path(''), type ).value('.', 'nvarchar(max)') ,1,1,'') set @query = n'select ' + @cols + n' ( select value, columnname yourtable ) x pivot ( max(value) columnname in (' + @cols + n') ) p ' exec sp_executesql @query; see demo.
if not want use pivot function, can use aggregate function case expression:
select max(case when columnname = 'firstname' value end) firstname, max(case when columnname = 'amount' value end) amount, max(case when columnname = 'postalcode' value end) postalcode, max(case when columnname = 'lastname' value end) lastname, max(case when columnname = 'accountnumber' value end) accountnumber yourtable see demo.
this completed using multiple joins, need column associate each of rows not have in sample data. basic syntax be:
select fn.value firstname, a.value amount, pc.value postalcode, ln.value lastname, an.value accountnumber yourtable fn left join yourtable on fn.somecol = a.somecol , a.columnname = 'amount' left join yourtable pc on fn.somecol = pc.somecol , pc.columnname = 'postalcode' left join yourtable ln on fn.somecol = ln.somecol , ln.columnname = 'lastname' left join yourtable on fn.somecol = an.somecol , an.columnname = 'accountnumber' fn.columnname = 'firstname'
Comments
Post a Comment