Please, have a look:
CREATE TABLE #exdata (student_id INT, metric VARCHAR(30), score VARCHAR(30))
INSERT INTO #exdata (student_id, metric, score)
SELECT 1, 'raw_score', '20'
UNION ALL SELECT 1, 'scale_score', '30'
UNION ALL SELECT 2, 'proficiency', 'level1'
UNION ALL SELECT 2, 'scale_score', '60'
UNION ALL SELECT 3, 'raw_score', '45'
UNION ALL SELECT 3, 'proficiency', 'level2'
UNION ALL SELECT 4, 'scale_score', '54'
UNION ALL SELECT 4, 'proficiency', 'level2'
DECLARE @cols VARCHAR(300)
DECLARE @dt VARCHAR(2000)
DECLARE @pt VARCHAR(MAX)
SET @cols = STUFF((SELECT DISTINCT '],[' + metric
FROM #exdata
ORDER BY '],[' + metric
FOR XML PATH('')),1,2,'') + ']'
SET @dt = N'SELECT *
FROM #exdata'
SET @pt = N'SELECT student_id, ' + @cols + ' ' +
'FROM(' + @dt + ') AS DT ' +
'PIVOT(MAX(score) FOR metric IN(' + @cols + ')) AS PT'
EXEC(@pt)
DROP TABLE #exdata
Result:
student_id proficiency raw_score scale_score
1 NULL 20 30
2 level1 NULL 60
3 level2 45 NULL
4 level2 NULL 54