答案 0 :(得分:1)
一种方法是使用条件聚合:
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
答案 1 :(得分:1)
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:convert Rows to Columns in SQL with same ID, Sql Server - rextester
答案 2 :(得分:1)
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]