try this by dynamic cross tab with out using aggregate functionsdeclare @i table (Col1 varchar(32),Col2 varchar(32))insert into @i SELECT'A','Peter' union all SELECT 'B','Nelson' union all SELECT 'C','USA' union all SELECT 'D','29' union all SELECT 'A','Mary' union all SELECT 'B','Kumar' union all SELECT 'C','USA' union all SELECT 'd','25'DROP TABLE #tempDROP TABLE #temp1SELECT ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY col1) AS rid,* INTO #temp FROM @iSELECT ROW_NUMBER()over(PARTITION BY rid ORDER BY col1,col2,col3,col4) AS id,* INTO #temp1 FROM(SELECT t.rid,CASE WHEN t.col1 = 'a' THEN t.col2 WHEN t.col1 = 'a' THEN t.col2 END col1,CASE WHEN t1.col1 = 'b' THEN t1.col2 WHEN t1.col1 = 'b' THEN t1.col2 END col2,CASE WHEN t2.col1 = 'c' THEN t2.col2 WHEN t2.col1 = 'c' THEN t2.col2 END col3,CASE WHEN t3.col1 = 'd' THEN t3.col2 WHEN t3.col1 = 'd' THEN t3.col2 END col4FROM #temp tLEFT JOIN #temp t1 ON t1.rid = t.rid LEFT JOIN #temp t2 ON t2.rid = t.rid LEFT JOIN #temp t3 ON t3.rid = t.rid )sDECLARE @maxid INTSELECT @maxid = id FROM #temp1SELECT col1,col2,col3,col4 FROM #temp1 where id = @maxid