SQL Server Динамическая версия:
--TEST DATA
CREATE TABLE #TestTable
([TravelID] int, [SitelD] int, [Flagi] int, [FIag2] int)
;
INSERT INTO #TestTable
([TravelID], [SitelD], [Flagi], [FIag2])
VALUES
(1001, 1, 1, 0),(1001, 1, 0, 1),(1001, 1, 3, 4),
(1002, 1, 1, 0),(1002, 2, 0, 1),(1002, 2, 3, 4)
;
--STEP 1 rank data
SELECT * into #rank_table from (
select *
,ROW_NUMBER() OVER (PARTITION BY [TravelID],[SitelD] order by [SitelD]) [rank]
from (
select * from #TestTable
) T100
)T;
--STEP 2 Group by row_count
SELECT * into #group_table from (
select [TravelID],[SitelD] ,count(1) [count]
from #TestTable T
group by [TravelID],[SitelD]
)T;
--Use Exec
DECLARE @select_sql AS NVARCHAR(MAX) = ' select T.[TravelID], T.[SitelD] ',
@join_sql AS NVARCHAR(MAX) = ' from #group_table T ',
@max_count INT = (SELECT max([count]) FROM #group_table),
@temp_string NVARCHAR(5),
@temp_string_addone NVARCHAR(5)
;
DECLARE @index int = 0 ;
WHILE @index < @max_count
BEGIN
sELECT @temp_string = Convert(nvarchar(10),@index);
sELECT @temp_string_addone = Convert(nvarchar(10),@index+1);
select @select_sql = @select_sql + ' , T'+@temp_string_addone+'.[Flagi] as Flag'+Convert(nvarchar(10),2*@index+1)+' '
+ ' , T'+@temp_string_addone+'.[FIag2] as Flag'+Convert(nvarchar(10),2*@index+2)+' ';
select @join_sql = @join_sql + 'left join #rank_table T'+@temp_string_addone+' on ' + ' T.[TravelID] = T'+@temp_string_addone+'.[TravelID] and '
+ ' T.[SitelD] = T'+@temp_string_addone+'.[SitelD] and '
+ 'T'+@temp_string_addone+'.[rank] = '+@temp_string_addone+' ';
SET @index = @index + 1;
END;
EXEC (@select_sql
+ @join_sql
+' order by [TravelID],[SitelD] ; ')
;
![](https://i.imgur.com/AqLPNyY.png)
DEMO: преобразование строк в столбцы в SQL с одинаковым идентификатором, Sql Server - rextester