I would use pivot so I included a pivot version and some other options as well.
A version with pivot and an aggregate. SE-Data
select P.FIELD1, P.FIELD2, P.FIELD3, P.FIELD4
from YourTable T
pivot (min(T.VALUE) for T.NAME in (FIELD1, FIELD2, FIELD3, FIELD4)) P
A version without pivot but still using an aggregate. SE-Data
select min(case when T.NAME = 'FIELD1' then T.VALUE end) as FIELD1,
min(case when T.NAME = 'FIELD2' then T.VALUE end) as FIELD2,
min(case when T.NAME = 'FIELD3' then T.VALUE end) as FIELD3,
min(case when T.NAME = 'FIELD4' then T.VALUE end) as FIELD4
from (select RECORDSET, NAME, VALUE from YourTable) T
group by T.RECORDSET
No pivot and no aggregate. SE-Data
select T.R.value('(VALUE[@Name = "FIELD1"])[1]', 'varchar(10)') as FIELD1,
T.R.value('(VALUE[@Name = "FIELD2"])[1]', 'varchar(10)') as FIELD2,
T.R.value('(VALUE[@Name = "FIELD3"])[1]', 'varchar(10)') as FIELD3,
T.R.value('(VALUE[@Name = "FIELD4"])[1]', 'varchar(10)') as FIELD4
from
(
select (select T1.NAME as "@Name",
T1.VALUE as "*"
from @T T1
where T1.RECORDSET = T.RECORDSET
for xml path('VALUE'), root('RECORDSET'), type)
from YourTable T
group by T.RECORDSET
for xml path(''), type
) X(XML)
cross apply X.XML.nodes('RECORDSET') as T(R)
Another no pivot no aggregate version. SE-Data
select (select T2.VALUE
from YourTable T2
where T.RECORDSET = T2.RECORDSET and
T2.NAME = 'FIELD1') as FIELD1,
(select T2.VALUE
from YourTable T2
where T.RECORDSET = T2.RECORDSET and
T2.NAME = 'FIELD2') as FIELD2,
(select T2.VALUE
from YourTable T2
where T.RECORDSET = T2.RECORDSET and
T2.NAME = 'FIELD3') as FIELD3,
(select T2.VALUE
from YourTable T2
where T.RECORDSET = T2.RECORDSET and
T2.NAME = 'FIELD4') as FIELD4
from YourTable T
group by T.RECORDSET