Вы можете попробовать использовать функцию агрегирования условий make pivot.
;WITH CTE AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
FROM [values]
)
SELECT FieldId,
MAX(CASE WHEN rn = 1 THEN value END),
MAX(CASE WHEN rn = 2 THEN value END),
MAX(CASE WHEN rn = 3 THEN value END)
FROM CTE
GROUP BY FieldId
sqlfiddle
EDIT
Если вы хотите, чтобы ваши столбцы создавались динамически.
Вы можете попробовать использовать динамический пивот.
с использованием CTE
рекурсии сделать номер строки из минимальной строки в максимальную строку.
затем используйте агрегатную функцию SQL условия записи номера строки.
DECLARE @cols AS NVARCHAR(MAX) = '',
@query AS NVARCHAR(MAX);
;WITH CTE AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
FROM [values]
), CTE2 AS (
SELECT MIN(rn) minID,MAX(rn) maxID
FROM CTE
UNION ALL
SELECT minID + 1,maxID
FROM CTE2
WHERE minID + 1<=maxID
)
SELECT @cols = @cols + 'MAX(CASE WHEN rn ='+ cast(minID as varchar(5)) +' THEN value END) Value'+CAST(minID AS VARCHAR(5))+','
FROM CTE2
set @cols = substring(@cols,0,len(@cols))
set @query = '
;WITH CTE AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
FROM [values]
)
SELECT FieldId,' + @cols + '
FROM CTE
GROUP BY FieldId'
execute(@query)
sqlfiddle