问题描述
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 <> '' ...
(和col2
和col3
的类似物。)
这就是您要去的地方吗?
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;