So first off just staging your data up. Note that I'm adding an identity row id for later.
IF OBJECT_ID('tempdb..#test') IS NOT NULL
drop table #test
IF OBJECT_ID('tempdb..#Numbered') IS NOT NULL
drop table #Numbered
CREATE TABLE #test (Code CHAR(2), [DESC] varchar(10), [type id] INT, RowNumber INT IDENTITY(1,1))
INSERT #test
VALUES ('01', 'Rajan', 1),
('01' ,'Sajan', 1),
('01' ,'Vijayan', 2),
('01' ,'Suresh', 3),
('01' ,'Caresh', 4),
('01' ,'Sujesh', 4),
('01' ,'vikran', 4),
('02' ,'desk', 1),
('02' ,'card' ,2),
('02' ,'villa', 2),
('02', 'megash', 2),
('02', 'supan', 3)
Then we create a holding area that uses that row id to calculate which row of the code each of the names should go on.
CREATE TABLE #Numbered
(
RowNum int, Code CHAR(2), [type] VARCHAR(10), [DESC] VARCHAR(10)
)
INSERT #Numbered
SELECT (select count(*) from #test where code=t1.Code AND [type id]=t1.[type id] AND RowNumber<=t1.RowNumber),
code,
[type id],
[DESC]
FROM #test t1
Lastly, we create a PIVOT table on the data, (done in a standard SQL 2000 way of "faking" that operator). We then place that "PIVOT table" in a derived select that returns only the columns we want but allows us to sort on the code and rownum columns to generate the output you asked for.
SELECT Code,[type-1],[type-2],[type-3],[type-4]
FROM (Select P.Code,RowNum
, Min( Case When type = '1' Then [DESC] End ) As [type-1]
, Min( Case When type = '2' Then [DESC] End ) As [type-2]
, Min( Case When type = '3' Then [DESC] End ) As [type-3]
, Min( Case When type = '4' Then [DESC] End ) As [type-4]
From #Numbered As P
Group By P.Code,RowNum) R
ORDER BY Code,RowNum
Please let me know if you want further explanation on any of this.