使用sql查询将相同的列值连接到单个行

时间:2017-11-30 08:45:40

标签: sql sql-server

我要求使用sql查询将相同的列值连接到单行。 表A

TxnId   Sequence    Value
111        1          A
111        2         for
111        3         Apple
222        1         B-
222        2         Ball
333        1         C-Cat

预期结果

TxnId   Value
111      A for Apple
222      B- Ball
333      C-Cat

请帮忙。我需要根据TxnId和序列

连接值

3 个答案:

答案 0 :(得分:1)

Stuff()

xml功能可以帮助您

SELECT TxnId,
       Value = STUFF(
                    (
                        SELECT ' '+Value FROM <table>
                        WHERE TxnId = T.TxnId
                        ORDER BY Sequence FOR XML PATH(''), TYPE
                    ).value('(text())[1]', 'nvarchar(MAX)'), 1, 1, '')
FROM <table> T GROUP BY TxnId;

结果:

TxnId   Value
111     A for Apple
222     B- Ball 
333     C-Cat

答案 1 :(得分:0)

这个listagg有一个标准的SQL函数,SQL Server尚不支持它。但是,自SQL Server的最新版本以来,它有类似的东西:string_agg

它沿着这条线工作:

SELECT TxnId
     , string_agg(value, ' ') WITHIN GROUP (ORDER BY Sequence)
  FROM ...
 GROUP BY TxnId

答案 2 :(得分:0)

使用group concatenation的XML路径。

SQL代码

declare @myt table (txnid int,[sequence] int , [value] nvarchar(50))
insert into @myt    
values
(111        ,1,         'A'    ),
(111        ,2,         'for'  ),
(111        ,3,         'Apple'),
(222        ,1,         'B-'   ),
(222        ,2,         'Ball' ),
(333        ,1,         'C-Cat')



SELECT txnid, [Value] = STUFF((SELECT N' ' + [Value] 
FROM @myt AS p2
WHERE p2.txnid = p.txnid 
ORDER BY [sequence]
FOR XML PATH(N'')), 1, 1, N'')
FROM @myt AS p
GROUP BY txnid
ORDER BY txnid;

<强>结果

enter image description here