Dynamique complexe SQL Pivotant 2

Salut, j'essaie dans SQL Server le pivotement de la table suivante

REFID | COL1 | COL2 | Sequence 1 abc cde 1 1 lmn rst 2 1 kna asg 3 2 als zkd 2 2 zpk lad 1 

Je veux la sortie comme

  REFID | 1COL1 | 2COL1 | 3COL1 |1COL2|2COL2|3COL2 1 abc lmn kna cde rst asg 2 zpk als null lad zkd null 

Le nombre de colonnes dans la table d'origine est connu mais le nombre de lignes n'est pas connu. Quelqu'un peut-il aider

Si vous souhaitez inclure le numéro de sequence dans vos noms de colonnes, vous devrez tout d'abord resize vos colonnes col1 et col2 , puis appliquer le pivot. La différence est que vous allez concaténer le numéro de sequence à vos noms de colonnes créés pendant le process de non-pivot.

Pour un nombre de valeurs connu, la requête serait:

 select REFID, [1col1], [2col1], [3col1], [1col2], [2col2], [3col2] from ( select REFID, col = cast(Sequence as varchar(10))+ col, value from yourtable cross apply ( select 'COL1', col1 union all select 'COL2', col2 ) c (col, value) ) d pivot ( max(value) for col in ([1col1], [2col1], [3col1], [1col2], [2col2], [3col2]) ) piv order by refid; 

Ensuite, si vous avez un nombre inconnu, la version SQL dynamic sera:

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + QUOTENAME(cast(Sequence as varchar(10))+ col) from yourtable cross apply ( select 'Col1', 1 union all select 'Col2', 2 ) c(col, so) group by Sequence, col, so order by so, sequence FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT refid, ' + @cols + ' from ( select REFID, col = cast(Sequence as varchar(10))+ col, value from yourtable cross apply ( select ''COL1'', col1 union all select ''COL2'', col2 ) c (col, value) ) x pivot ( max(value) for col in (' + @cols + ') ) p order by refid' execute sp_executesql @query;