I guess something like this: -
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL='SELECT '+CHAR(13)+CHAR(10)+
STUFF((SELECT ','+CHAR(13)+CHAR(10)+'NULLIF(MAX(CASE WHEN [name] = '+CHAR(39)+[name]+CHAR(39)+
' THEN [length] ELSE '+CHAR(39)+CHAR(39)+' END),'+CHAR(39)+CHAR(39)+
') AS '+QUOTENAME([name])
FROM (SELECT DISTINCT [name]
FROM test
)a([name])
ORDER BY LEN([name]),[name]
FOR XML PATH(''), TYPE).value('.','VARCHAR(MAX)'),1,3,'')+CHAR(13)+CHAR(10)+'FROM [dbo].[test]'+
CHAR(13)+CHAR(10)+'GROUP BY [length];';
EXECUTE sp_executesql @SQL;
Which returns: -
balk1 stof1 stof2 stof3 stof4 stof5 stof6 stof7 stof8 stof9 stof10 stof11 stof12
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
6 6 6 6 6 6 6 6 6 6 6 6 6
7 NULL NULL NULL NULL 7 NULL NULL NULL 7 NULL NULL NULL
9 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL