CREATE TABLE #Test (ID int NOT NULL IDENTITY(1,1) Primary key, TranID int NOT NULL, OriginCode varchar(5) NOT NULL, DestinationCode varchar(5) NOT NULL ) GO INSERT INTO #Test SELECT 201205 ,'AMD','DOH' UNION ALL SELECT 201205 ,'DOH','NBO' UNION ALL SELECT 201205 ,'NBO','ADD' UNION ALL SELECT 201205 ,'ADD','DEL' UNION ALL SELECT 201205 ,'DEL','AMD' UNION ALL SELECT 201206 ,'IXJ','RMI' GO SELECT * FROM #Test DROP TABLE #Test
TranID Code201205 AMDDOHNBOADDDELAMD201206 IXJRMI
select TranID , OriginCode + DestinationCode 'Code' from #Test
set nocount on CREATE TABLE #Test (ID int NOT NULL IDENTITY(1,1) Primary key, TranID int NOT NULL, OriginCode varchar(5) NOT NULL, DestinationCode varchar(5) NOT NULL ) GO CREATE TABLE #Test2 ( TranID int NOT NULL, Code varchar(100) NOT NULL, )go INSERT INTO #Test SELECT 201205 ,'AMD','DOH' UNION ALL SELECT 201205 ,'DOH','NBO' UNION ALL SELECT 201205 ,'NBO','ADD' UNION ALL SELECT 201205 ,'ADD','DEL' UNION ALL SELECT 201205 ,'DEL','AMD' UNION ALL SELECT 201206 ,'IXJ','RMI' GODECLARE @Tran_id int, @Tran_name nvarchar(50) DECLARE test_cursor CURSOR FOR SELECT TranID, OriginCode + DestinationCode FROM #TestOPEN test_cursorFETCH NEXT FROM test_cursor INTO @Tran_id, @Tran_name WHILE @@FETCH_STATUS = 0BEGINif exists ( select 'x' from #Test2 where TranID = @Tran_id)Beginupdate #Test2set code = code+ @Tran_namewhere TranID = @Tran_idendelse begininsert into #Test2 select @Tran_id, @Tran_nameendFETCH NEXT FROM test_cursor INTO @Tran_id, @Tran_nameEndCLOSE test_cursorDEALLOCATE test_cursor select * from #Test2 DROP TABLE #TestDROP TABLE #Test2set nocount off
SELECT tranid, ( SELECT OriginCode + DestinationCode FROM #test p2 WHERE p1.tranid = p2.tranid FOR XML PATH(''))FROM #test p1 GROUP BY tranid
WITH CTE AS (SELECT ID, TranID, CASE WHEN a.N = 1 THEN OriginCode ELSE DestinationCode END AS code,ROW_NUMBER() OVER(PARTITION BY TranID ORDER BY ID, a.N) AS posFROM #TestCROSS JOIN (SELECT 1 UNION ALL SELECT 2)a(N)),CTE2 AS (SELECT ID, TranID, code, CAST(code AS VARCHAR(MAX)) AS overallCode, posFROM CTEWHERE pos = 1UNION ALL SELECT b.ID, b.TranID, b.code, overallCode + b.code, b.posFROM CTE2 aINNER JOIN CTE b ON a.TranID = b.TranID AND a.pos < b.pos AND a.code <> b.code)SELECT TranID, overallCodeFROM (SELECT TranID, overallCode, ROW_NUMBER() OVER(PARTITION BY TranID ORDER BY LEN(overallCode) DESC) FROM CTE2) a(TranID, overallCode, ItemNumber)WHERE ItemNumber = 1;
TranID overallCode----------- --------------------201205 AMDDOHNBOADDDELAMD201206 IXJRMI