DECLARE @t TABLE ( TransNo VARCHAR(20), Serial INT, Project INT ) INSERT INTO @t (TransNo, Serial, Project) VALUES ('A00000000000001', 1, 100), ('A00000000000001', 2, 200), ('A00000000000001', 3, 201), ('A00000000000001', 4, 101), ('A00000000000002', 1, 100), ('A00000000000002', 2, 101), ('A00000000000003', 1, 100), ('A00000000000003', 2, 200), ('A00000000000004', 1, 200), ('A00000000000004', 2, 100), ('A00000000000005', 1, 101), ('A00000000000005', 2, 100) SELECT *, CProject = ( SELECT DISTINCT [text()] = t2.Project FROM @t t2 WHERE t2.TransNo = t1.TransNo ORDER BY t2.Project FOR XML PATH('') ) FROM @t t1
输出 -
TransNo Serial Project CProject -------------------- ----------- ----------- -------------- A00000000000001 1 100 100101200201 A00000000000001 2 200 100101200201 A00000000000001 3 201 100101200201 A00000000000001 4 101 100101200201 A00000000000002 1 100 100101 A00000000000002 2 101 100101 A00000000000003 1 100 100200 A00000000000003 2 200 100200 A00000000000004 1 200 100200 A00000000000004 2 100 100200 A00000000000005 1 101 100101 A00000000000005 2 100 100101
与[text()]
-
100101200201
没有[text()]
-
100 101 200 201
更多详情 - http://www.codeproject.com/Articles/691102/String-Aggregation-in-the-World-of-SQL-Server
更新 -
SELECT *, CProject = ( SELECT [text()] = t2.Project FROM ( SELECT t2.Project, Serial = MIN(t2.Serial) FROM @t t2 WHERE t2.TransNo = t1.TransNo GROUP BY t2.Project ) t2 ORDER BY t2.Serial FOR XML PATH('') ) FROM @t t1