7

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

举个例子:

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 

这个问题可以在我设置的小提琴中看到

预期的结果是:

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

最后,当我在组合中添加更多列时,这变得更加困难。我想合并ID相同的结果(如上所示)。这很好用,group_concat因为它会自动合并已经组合在一起的行。

4

1 回答 1

7

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

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

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

请参阅演示。这给出了一个结果:

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

完成初始连接后,您可以使用FOR XML PATHandSTUFF获得最终结果:

;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 |
于 2013-06-18T20:28:34.377 回答