在SQL Server中完成MYSQL的Group_Concat

Wha*_*ied 7 t-sql concatenation group-concat sql-server-2008

我正在移植一个我最初使用PHP和MySQL数据库在Apache上运行的应用程序.其中一个查询使用了MySQL的函数,Concat_WSGroup_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因为它会自动合并已组合在一起的行.

Tar*_*ryn 7

这可以使用两步过程完成.

首先,你可以使用一个公用表表达式执行的第一个串联namecandy.第一部分使用查询:

;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 PATHSTUFF获取最终结果:

;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)