合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数
示例表 tb 数据如下
id ? value
—————
1??? aa
1 ?? bb
2??? aaa
2 ?? bbb
2 ?? ccc
?
第一种
SELECT id, [val]= REPLACE( (SELECT [value] AS [data()] FROM tb AS b WHERE b.id = a.id FOR XML PATH('')) , ' ', ',')FROM tb AS a GROUP BY id
?结果与第三种一样,最为理想。
?
解析:[data()] 这里据说是起到一个类似数组的作用,具体用法还要再查。
如果外围不用REPLACE函数包住,则返回的结果是 aaa bbb ccc ,每项之间有空格,所以最后用REPLACE函数将所有空格替换成逗号。
?
?
注
1、计算列可以不用包含在聚合函数中而直接显示,如下面语句的val。
2、for xml path('') 应该应用于语句的最后面,继而生成xml。
3、for xml path('root')中的path参数是生成的xml最顶级节点。
4、字段名或是别名将成为xml的子节点,对于没有列名(字段+'')或是没有别名的字段将直接显示。如[value] +','则是用,分隔的数据(aa,bb,)。