So, you can try this:
CREATE TABLE table1 (
NoInduk int,
Nama nvarchar(50),
[Code] char(1),
Score int)
INSERT INTO table1 VALUES
(2281, 'Ali Peny Lukito', 'U', 69),
(2281, 'Ali Peny Lukito', 'U', 80),
(2281, 'Ali Peny Lukito', 'U', 96),
(2281, 'Ali Peny Lukito', 'U', 90),
(2281, 'Ali Peny Lukito', 'U', 86),
(2281, 'Ali Peny Lukito', 'U', 80),
(2281, 'Ali Peny Lukito', 'U', 80),
(2304, 'Can Wong', 'U', 80),
(2304, 'Can Wong', 'U', 72),
(2304, 'Can Wong', 'U', 86),
(2304, 'Can Wong', 'U', 90),
(2304, 'Can Wong', 'U', 86),
(2304, 'Can Wong', 'U', 83)
and then use dynamic SQL with CTE and PIVOT:
DECLARE @num INT,
@u nvarchar(512),
@sql_q nvarchar(max)
SELECT TOP 1 @num = COUNT(Score)
FROM table1
GROUP BY NoInduk
ORDER BY COUNT(Score) DESC
;WITH num AS (
SELECT @num as n
UNION ALL
SELECT n-1
FROM num
WHERE n > 1
)
SELECT @u = STUFF((
SELECT ',U' + CAST(n as nvarchar(5))
FROM num
ORDER BY n ASC
FOR XML PATH ('')),1,1,'')
SET @sql_q =
';WITH cte AS (
SELECT ROW_NUMBER() OVER(PARTITION BY Nama ORDER BY Score DESC) AS Row,
NoInduk,
Nama,
[Code],
Score
FROM table1
)
SELECT NoInduk,[Nama],' + @u +
' FROM
(
SELECT NoInduk,
Nama,
[Code] + CAST ([Row] as nvarchar(5)) as [Code],
Score
FROM cte
) d
pivot
(
SUM(Score) for [Code] in (' +@u +
')) piv
ORDER BY NoInduk, [Nama];'
EXEC sp_executesql @sql_q
Results:
NoInduk Nama U1 U2 U3 U4 U5 U6 U7
2281 Ali Peny Lukito 96 90 86 80 80 80 69
2304 Can Wong 90 86 86 83 80 72 NULL