sql server - How to convert rows into column in sql -
i have table,
and need convert
i have tried pivot can't figure out please me out .
pivot not work more 1 column out-of-the-box there several approaches solve this:
use table variable tests , please state sample data copy'n'pasteable. best mcve (minimal complete verifyable example) set code mine here.
declare @tbl table(id int, code int,employeename varchar(100),examname varchar(100),board varchar(100),result varchar(100)); insert @tbl values (11537,12984,'thename','ssc','b04','1st') ,(11537,12984,'thename','hsc','b04','2nd') ,(11537,12984,'thename','ba(h)','u33','2nd');
this code first concatenate data 1 single column. allows pivot
:
select p.* ( select tbl.id ,tbl.code ,tbl.employeename ,'exam_' + cast(row_number() over(partition tbl.id order tbl.code) varchar(100)) colname ,examname + ' (' + board + '): ' + result concatenated @tbl tbl ) t pivot ( min(concatenated) colname in(exam_1,exam_2,exam_3 /*add many need*/) ) p
the result:
11537 12984 thename ssc (b04): 1st hsc (b04): 2nd ba(h) (u33): 2nd
the next code quite same, creates xml instead of plain text, allows separate data afterwards:
select p.id ,p.code ,p.employeename ,e1 ,e1.value('(/exam/@examname)[1]','varchar(100)') examname1 ,e1.value('(/exam/@board)[1]','varchar(100)') board1 ,e1.value('(/exam/@result)[1]','varchar(100)') result1 ,e2 ,e2.value('(/exam/@examname)[1]','varchar(100)') examname2 ,e2.value('(/exam/@board)[1]','varchar(100)') board2 ,e2.value('(/exam/@result)[1]','varchar(100)') result2 ,e3 ,e3.value('(/exam/@examname)[1]','varchar(100)') examname3 ,e3.value('(/exam/@board)[1]','varchar(100)') board3 ,e3.value('(/exam/@result)[1]','varchar(100)') result3 ( select tbl.id ,tbl.code ,tbl.employeename ,'exam_' + cast(row_number() over(partition tbl.id order tbl.code) varchar(100)) colname ,(select examname [@examname],board [@board],result [@result] xml path('exam')) asxml @tbl tbl ) t pivot ( min(asxml) colname in(exam_1,exam_2,exam_3 /*add many need*/) ) p outer apply ( select cast(p.exam_1 xml) e1 ,cast(p.exam_2 xml) e2 ,cast(p.exam_3 xml) e3 ) castedtoxml
the result:
11537 12984 thename <exam examname="ssc" board="b04" result="1st" /> ssc b04 1st <exam examname="hsc" board="b04" result="2nd" /> hsc b04 2nd <exam examname="ba(h)" board="u33" result="2nd" /> ba(h) u33 2nd
this old-fashioned-pivot quite better normal pivot:
;with numberd ( select * ,row_number() over(partition tbl.id order tbl.code) number @tbl tbl ) select id,code,employeename ,max(case when number=1 examname end) examname1 ,max(case when number=1 board end) board1 ,max(case when number=1 result end) result1 ,max(case when number=2 examname end) examname2 ,max(case when number=2 board end) board2 ,max(case when number=2 result end) result2 ,max(case when number=3 examname end) examname3 ,max(case when number=3 board end) board3 ,max(case when number=3 result end) result3 numberd group id,code,employeename
the last option dynamic sql...
Comments
Post a Comment