• This is the dynamic one. I prefer not to do dynamic SQL in my projects but sometimes it is unavoidable. Maybe see if you can do something on the client side rather than doing dynamic SQL.

    In any case, here follows the query:

    DECLARE @COLUMNS INT

    DECLARE @SQLSTR NVARCHAR(MAX)

    DECLARE @I INT

    SELECT @I = 2

    --GET THE NUMBER OF ALIASES WE WILL HAVE TO ITERATE OVER

    ;WITH CTE_APPS

    AS

    (

    SELECT

    COUNT(*) AS COUNTED

    FROM #apps

    GROUP BY Applicationid

    )

    SELECT @COLUMNS = MAX(COUNTED) FROM CTE_APPS

    SELECT @SQLSTR = '

    ;WITH CTE_PIVOT

    AS

    (

    SELECT

    Applicationid,

    CASE SOURCE WHEN ''AR'' THEN applicationname ELSE NULL END AS applicationname,

    '

    --1ST LOOP TO DO THE PIVOT

    WHILE @I <= @COLUMNS

    BEGIN

    SELECT @SQLSTR = @SQLSTR + 'CASE ROW_NUMBER() OVER ( PARTITION BY Applicationid ORDER BY CASE SOURCE WHEN ''AR'' THEN 0 ELSE 1 END ) WHEN ' + CONVERT(VARCHAR,@I) + ' THEN applicationname ELSE NULL END AS ALIAS' + CONVERT(VARCHAR,@I - 1 )

    IF @I < @COLUMNS SELECT @SQLSTR = @SQLSTR + ',

    '

    SELECT @I = @I + 1

    END

    SELECT @SQLSTR = @SQLSTR + '

    FROM #apps

    )

    SELECT

    MAX(applicationname) AS applicationname,

    '

    --LOOP TO CREATE THE COLUMN LIST

    SELECT @I = 1

    WHILE @I < @COLUMNS

    BEGIN

    SELECT @SQLSTR = @SQLSTR + 'MAX(CTE_PIVOT.ALIAS' + CONVERT(VARCHAR,@I) + ') AS ALIAS' + CONVERT(VARCHAR,@I)

    IF @I < @COLUMNS - 1 SELECT @SQLSTR = @SQLSTR + ',

    '

    SELECT @I = @I + 1

    END

    SELECT @SQLSTR = @SQLSTR + '

    FROM CTE_PIVOT

    GROUP BY Applicationid '

    PRINT @SQLSTR

    EXEC SP_EXECUTESQL @SQLSTR