在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]

Posted

技术标签:

【中文标题】在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]【英文标题】:Accomplishing MYSQL's Group_Concat in SQL Server [duplicate] 【发布时间】:2013-06-15 05:00:07 【问题描述】:

我正在移植一个我最初编写的应用程序,以便使用 phpmysql 数据库在 Apache 上运行。其中一个查询使用了Concat_WSGroup_Concat 的MySQL 函数,首先将几个不同的列连接成一个字符串,然后连接由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 

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

预期的结果是:

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

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

【问题讨论】:

@bluefeet 我已经看到了这个问题,但我试图避免使用 XML。我真的很想保持我在以前版本的应用程序中使用的格式。 有多种方法可以获取所需格式的数据,但在 SQL Server 中,没有简单的方法可以将多行数据连接成一行。 @bluefeet 那么我怎样才能改变这个问题以便它得到回答而不是关闭呢?我今天已经阅读了大量关于这个主题的书,但我自己仍然没有得到它(显然我现在在这里) @Whathaveyoutried 您可能想解释为什么重复项没有回答您的问题,“相同格式”有点含糊,查询看起来是否存在问题或格式为结果还是……? @JoachimIsaksson 当我自己尝试使用for xml path 时,我得到了一个带有xml 标题的结果,这是我不喜欢的。类似<name>name_here</name> 【参考方案1】:

这可以通过两个步骤来完成。

首先,您可以使用公用表表达式来执行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 |

【讨论】:

我非常感谢这个答案。我将尝试将它与我的实际数据集一起使用,这当然比我发布的要复杂得多。我会尽我所能让它按预期工作,但如果我不能,我会在这里发布一些。再次感谢。 这非常有效。老实说,我不确定我错过了什么。我认为查询被分成两部分的事实是诀窍。我很感激你不急于结束这个,即使答案就在那里,因为我对他们中的任何一个都没有运气。 @Whathaveyoutried 我很高兴你能成功。 这对我来说非常棒! 请注意 => 这不处理 XML 编码用于特殊字符 <>& 的转义。请参阅 this SO post on how to handle XML encoding 使用 .value()

以上是关于在 SQL Server 中完成 MYSQL 的 Group_Concat [重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库数据能不能导入到sql server中

通过sql server 连接mysql

如何从程序向 Sql Server 和 MySql 发送查询?

将 MySQL 数据库数据迁移到 SQL Server [重复]

sql server 中如何插入一条时间记录

SQL Server 对接MySQL 数据库