如何串联SQL Server 2016中的列数据?

问题描述

我有一个复杂的查询,它返回以下内容

MyID  col1  col2  col3
1     A:11        
1     A:21
1     A:31  
1                 C:13
1                 C:23
2           B:21  
2           B:22  

我将此查询的结果集保存在临时表#tt中,以便以后使事情变得更简单。

我想实现的是这样:

MyID  col1              col2        col3
1     A:11__A:21__A:31              C:13__C:23
2                       B:21__B:22  

但最终查询返回以下内容

MyID  col1                col2          col3
1     A:11__A:21__A:31__  ________      ____C:13__C:23
2     __                  B:21__B:22    __

这是查询

select
    MyID,col1= stuff((select N'__' + col1 from #tt where MyID = x.MyID for xml path(''),type ).value(N'.[1]',N'nvarchar(max)'),1,2,N'' ),col2= stuff((select N'__' + col2 from #tt where MyID = x.MyID for xml path(''),col2= stuff((select N'__' + col3 from #tt where MyID = x.MyID for xml path(''),N'' )
from #tt as x
group by MyID

如您所见,返回了许多下划线。由于我只显示较小的数据样本,因此当我在整个表上运行时,会有更多不必要的下划线。看来我在犯一些我无法弄清楚的小错误。我该如何解决该问题?

如果我使用的是sql Server 2017或更高版本,string_agg()可能会有所帮助。

解决方法

过滤子查询中的空值或NULL

... from #tt where MyID = x.MyID AND col1 IS NOT NULL AND col1 <> '' ...

(和col2col3的类似物。)

,

这就是您要去的地方吗?

SELECT
    MyID,col1 = ISNULL(STUFF((SELECT N'__' + NULLIF(col1,'') FROM #tt WHERE MyID = x.MyID FOR XML PATH(''),TYPE).value(N'.[1]',N'nvarchar(max)'),1,2,N''),''),col2 = ISNULL(STUFF((SELECT N'__' + NULLIF(col2,col2 = ISNULL(STUFF((SELECT N'__' + NULLIF(col3,'')
FROM
    #tt x
GROUP BY
    MyID;