在SQL Server中完成MYSQL的Group_Concat

时间:2013-06-18 20:13:54

标签: sql-server-2008 tsql concatenation group-concat

我正在移植一个我最初使用PHP和MySQL数据库在Apache上运行的应用程序。其中一个查询使用Concat_WSGroup_Concat的MySQL函数首先将几个不同的列连接成一个字符串,然后连接由Group_By子句组合在一起的所有项。 / p>

举个例子:

ID    Name    Candy
1     John    M&Ms
1     John    KitKat

查询:

Select Group_Concat(Concat_WS('-',Name, Candy) Separator '00--00') as UserCandy
From ExampleTable
Group By ID

结果:

UserCandy
John-M&Ms00--00John-KitKat

现在,我正在尝试使用PHP 5.4 +在SQL Server 2008中完成相同的结果。

我尝试了什么:

SELECT Stuff(name + ';' + candy, 1, 0, '-----') AS UserCandy 
FROM   test 

问题can be seen in the fiddle that I have setup

预期结果将是:

-----John;MMs-----John;KitKat

最后,当我向混音中添加更多列时,这变得更加困难。我想合并ID相同的结果(如上所示)。这与group_concat非常有效,因为它会自动合并已组合在一起的行。

1 个答案:

答案 0 :(得分:7)

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

首先,您可以使用公用表表达式来执行namecandy的第一次连接。第一部分使用查询:

;with cte as
(
  select id, name+';'+ candy UserCandy
  from table_test
)
select *
from cte

Demo。这给出了一个结果:

| ID |   USERCANDY |
--------------------
|  1 |    John;MMs |
|  1 | John;KitKat |

初始拼接完成后,您可以使用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;

SQL Fiddle with Demo。这给出了一个结果:

| ID |                     USERCANDY |
--------------------------------------
|  1 | -----John;MMs-----John;KitKat |