我正在移植一个我最初使用PHP和MySQL数据库在Apache上运行的应用程序。其中一个查询使用Concat_WS
和Group_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
非常有效,因为它会自动合并已组合在一起的行。
答案 0 :(得分:7)
这可以使用两步过程完成。
首先,您可以使用公用表表达式来执行name
和candy
的第一次连接。第一部分使用查询:
;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 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;
见SQL Fiddle with Demo。这给出了一个结果:
| ID | USERCANDY |
--------------------------------------
| 1 | -----John;MMs-----John;KitKat |