Wha*_*ied 7 t-sql concatenation group-concat sql-server-2008
我正在移植一个我最初使用PHP和MySQL数据库在Apache上运行的应用程序.其中一个查询使用了MySQL的函数,Concat_WS并Group_Concat首先将几个不同的列连接成一个字符串,然后连接由该Group_By子句组合在一起的所有项.
举个例子:
ID Name Candy
1 John M&Ms
1 John KitKat
Run Code Online (Sandbox Code Playgroud)
查询:
Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy
From ExampleTable
Group By ID
Run Code Online (Sandbox Code Playgroud)
结果:
UserCandy
John-M&Ms00--00John-KitKat
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试使用PHP 5.4+在SQL Server 2008中完成相同的结果.
我尝试过的:
SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy
FROM test
Run Code Online (Sandbox Code Playgroud)
这个问题可以在我设置的小提琴中看到.
预期结果将是:
-----John;MMs-----John;KitKat
Run Code Online (Sandbox Code Playgroud)
最后,当我添加更多列时,这变得更加困难.我想合并ID相同的结果(如上所示).这非常有效,group_concat因为它会自动合并已组合在一起的行.
这可以使用两步过程完成.
首先,你可以使用一个公用表表达式执行的第一个串联name和candy.第一部分使用查询:
;with cte as
(
select id, name+';'+ candy UserCandy
from table_test
)
select *
from cte
Run Code Online (Sandbox Code Playgroud)
见演示.这给出了一个结果:
| ID | USERCANDY |
--------------------
| 1 | John;MMs |
| 1 | John;KitKat |
Run Code Online (Sandbox Code Playgroud)
初始连接完成后,您可以使用FOR XML PATH和STUFF获取最终结果:
;with cte as
(
select id, name+';'+ candy UserCandy
from table_test
)
select distinct c.id,
STUFF(
(SELECT '-----' + c2.UserCandy
FROM cte c2
where c.id = c2.id
FOR XML PATH (''))
, 1, 0, '') AS UserCandy
from cte c;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.这给出了一个结果:
| ID | USERCANDY |
--------------------------------------
| 1 | -----John;MMs-----John;KitKat |
Run Code Online (Sandbox Code Playgroud)