• This code will dynamically

    - add a suffix to each duplicated QuestionNo

    - build SQL to pivot the data

    UPDATE dbo.TestTable1

    SET Identifier = upd.Identifier

    FROM dbo.TestTable1 AS orig

    INNER JOIN (

    SELECT

    data.PKID

    , Identifier = data.Identifier + sfx.suffix

    FROM (

    SELECT src.Identifier, src.PKID

    , rn = ROW_NUMBER() OVER (PARTITION BY src.Identifier ORDER BY src.PKID)

    FROM dbo.TestTable1 as src

    INNER JOIN (SELECT Identifier FROM dbo.TestTable1

    WHERE Identifier LIKE 'Question%'

    GROUP BY Identifier

    HAVING COUNT(*) > 1

    ) AS dup ON src.Identifier = dup.Identifier

    ) AS data

    CROSS APPLY ( SELECT CASE WHEN data.rn <= 26 THEN CHAR(((data.rn -1) %26) + 97)

    ELSE CHAR(((data.rn -1) /26) + 96) + CHAR(((data.rn -1) %26) + 97)

    END

    ) AS sfx(suffix)

    ) AS upd ON orig.PKID = upd.PKID;

    DECLARE @cols VARCHAR(MAX) = STUFF((SELECT ', ' + QUOTENAME(Identifier)

    FROM dbo.TestTable1

    ORDER BY CASE WHEN Identifier LIKE 'Question%' THEN 1 ELSE 0 END, PKID

    FOR XML PATH('')

    ), 1, 2, '')

    DECLARE @SQL VARCHAR(MAX) = '

    select Period, Name, ' + @cols + '

    from (select Period, data, Identifier

    from dbo.TestTable1

    ) z

    pivot ( max(data)

    for Identifier in (' + @cols + ')

    ) piv

    ';