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