有必要在第二栏中的一行中列出所有相关账目。这显示一个错误将varchar值“”转换为数据类型int时,转换失败。
SELECT [UserID],STUFF((SELECT ', ' + UserIDFROM #RelatedIDsWHERE (UserID = t.UserID)FOR XML PATH('')) ,1,1,'') AS RelIDsFROM #RelatedIDs tGROUP BY UserID
SELECT [UserID],
STUFF((SELECT ', ' + UserID
FROM #RelatedIDs
WHERE (UserID = t.UserID)
FOR XML PATH('')) ,1,1,'') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID
vuv7lop31#
使用 CONCAT() 而不是 + :
CONCAT()
+
SELECT [UserID], STUFF((SELECT CONCAT(', ', UserID) FROM #RelatedIDs ri WHERE ri.UserID = t.UserID FOR XML PATH('') ), 1, 2, '') AS RelIDsFROM #RelatedIDs tGROUP BY UserID;
STUFF((SELECT CONCAT(', ', UserID)
FROM #RelatedIDs ri
WHERE ri.UserID = t.UserID
FOR XML PATH('')
), 1, 2, '') AS RelIDs
GROUP BY UserID;
注意,我还更改了参数的内容 1, 1 至 1, 2 . 那是因为逗号后面有空格。你的关联从句还表明,当你让它起作用时,结果不会很有趣。
1, 1
1, 2
ffvjumwh2#
你可以的 cast varchar的整数值:
cast
SELECT [UserID],STUFF((SELECT ',' + CAST(UserID as VARCHAR(100))FROM #RelatedIDsWHERE (UserID = t.UserID)FOR XML PATH('')) ,1,1,'') AS RelIDsFROM #RelatedIDs tGROUP BY UserID
STUFF((SELECT ',' + CAST(UserID as VARCHAR(100))
如果您运行的是最新版本的sql server(2017或更高版本),那么您可以使用 string_agg() :
string_agg()
SELECT t.UserID, STRING_AGG(r.UserID, ',') RelIDsFROM #RelatedIDs tINNER JOIN #RelatedIDs r on r.UserID = t.UserIDGROUP BY t.UserID
SELECT t.UserID, STRING_AGG(r.UserID, ',') RelIDs
INNER JOIN #RelatedIDs r on r.UserID = t.UserID
GROUP BY t.UserID
以这种方式提出这个问题,很明显,它没有什么意义。self-join与定义组的列在同一列上操作,因此这只会生成一个相同列的列表 UserID 列中的s RelIDs (每出现一次给定的 UserID 在原始查询中)。
UserID
RelIDs
2条答案
按热度按时间vuv7lop31#
使用
CONCAT()
而不是+
:注意,我还更改了参数的内容
1, 1
至1, 2
. 那是因为逗号后面有空格。你的关联从句还表明,当你让它起作用时,结果不会很有趣。
ffvjumwh2#
你可以的
cast
varchar的整数值:如果您运行的是最新版本的sql server(2017或更高版本),那么您可以使用
string_agg()
:以这种方式提出这个问题,很明显,它没有什么意义。self-join与定义组的列在同一列上操作,因此这只会生成一个相同列的列表
UserID
列中的sRelIDs
(每出现一次给定的UserID
在原始查询中)。