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

Popular posts from this blog

c++ - Difference between pre and post decrement in recursive function argument -

php - Nothing but 'run(); ' when browsing to my local project, how do I fix this? -

php - How can I echo out this array? -