преобразовать строки в столбцы в SQL с одинаковым идентификатором - PullRequest
0 голосов
/ 01 мая 2018

Народ,

У меня есть таблица с данными, как показано ниже.

введите описание изображения здесь

Посоветуйте, пожалуйста, логику sql, которая будет применяться для достижения этого результата.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

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] ; ')
;


DEMO: преобразование строк в столбцы в SQL с одинаковым идентификатором, Sql Server - rextester

0 голосов
/ 02 мая 2018
with CTE as(
    select 
    *
    ,ROW_NUMBER() OVER (PARTITION BY [TravelID],[SitelD] order by [SitelD]) [rk]
    from [Table]
)
select distinct a.[TravelID], a.[SitelD], a.[Flagi] as Flag1, a.[FIag2] as Flag1, b.[Flagi] as Flag3, b.[FIag2] as Flag4
from (select * from CTE where [rk] = 1) a
left join (select * from CTE where [rk] = 2) b on a.[TravelID] = b.[TravelID] and  a.[SitelD] =  + b.[SitelD]
0 голосов
/ 01 мая 2018

Один метод заключается в использовании условного агрегирования:

select travelid,
       max(case when seqnum = 1 then earn end) as earn,
       max(case when seqnum = 1 then burn end) as burn,
       max(case when seqnum = 2 then earn end) as earnA,
       max(case when seqnum = 2 then burn end) as burnB
from (select t.*, row_number() over (partition by travelid order by travelid) as seqnum
      from t
     ) t
group by travelid
...