Ниже было проверено в SQL-Server, но я думаю, что принципы могут быть применены к любой СУБД, которую вы используете.
CREATE TABLE #t (ItemID INT, PartID INT, PartName VARCHAR(2), PartValue VARCHAR(2))
INSERT #t VALUES (1, 1, 'N1', 'V1'), (1, 2, 'N2', 'V2'), (1, 3, 'N3', 'V3'), (2, 1, 'N1', 'V1'), (2, 2, 'N2', 'V2'), (2, 3, 'N3', 'V3')
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = ISNULL(@SQL, '') +
', ( SELECT PartValue
FROM #t t' + Rownum + '
WHERE t' + Rownum + '.ItemID = t.ItemID
AND t' + Rownum + '.PartName = ''' + PartName + '''
) [' + PartName + ']'
FROM ( SELECT PartName, CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY PartName)) [RowNum]
FROM #t
GROUP BY PartName
) d
SET @SQL = 'SELECT ItemID' + @SQL + ' FROM (SELECT DISTINCT ItemID FROM #t) t'
EXEC (@SQL)
DROP TABLE #t
Примечание. Скорее всего, это станет неэффективным, если у вас много данных и много столбцов