SQL如何将值放在一行
Posted
技术标签:
【中文标题】SQL如何将值放在一行【英文标题】:SQL how to put values on one line 【发布时间】:2020-09-15 01:08:52 【问题描述】:必须在第二列的单行中包含所有相关帐户。
这显示一个错误
将 varchar 值 ',' 转换为数据类型 int 时转换失败。
SELECT [UserID],
STUFF((SELECT ', ' + UserID
FROM #RelatedIDs
WHERE (UserID = t.UserID)
FOR XML PATH('')) ,1,1,'') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID
【问题讨论】:
您的子查询只会重复UserId
很多次。您应该提出一个新问题,其中包含样本数据、期望的结果以及您想要完成的任务的解释。
【参考方案1】:
您可以将 cast
整数值转换为 varchar:
SELECT [UserID],
STUFF((SELECT ',' + CAST(UserID as VARCHAR(100))
FROM #RelatedIDs
WHERE (UserID = t.UserID)
FOR XML PATH('')) ,1,1,'') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID
如果您运行的是最新版本的 SQL Server(2017 或更高版本),您可以使用string_agg()
以一种更简单的方式获得相同的结果:
SELECT t.UserID, STRING_AGG(r.UserID, ',') RelIDs
FROM #RelatedIDs t
INNER JOIN #RelatedIDs r on r.UserID = t.UserID
GROUP BY t.UserID
这样查询,很明显它没有什么意义。自联接在与定义组的列相同的列上运行,因此这只会在列RelIDs
中生成一个相同的UserID
s 列表(在原始查询中每次出现一个给定的UserID
) .
【讨论】:
【参考方案2】:使用CONCAT()
代替+
:
SELECT [UserID],
STUFF((SELECT CONCAT(', ', UserID)
FROM #RelatedIDs ri
WHERE ri.UserID = t.UserID
FOR XML PATH('')
), 1, 2, '') AS RelIDs
FROM #RelatedIDs t
GROUP BY UserID;
请注意,我还将 stuff 参数从 1, 1
更改为 1, 2
。那是因为逗号后面有一个空格。
你的相关性子句还表明,当你让它发挥作用时,结果不会很有趣。
【讨论】:
谢谢,但你是对的,第二列中重复了值,但我需要唯一的。我可以吗? @AnastasiiaVerbytska 。 . .问一个新的问题。提供样本数据、期望的结果以及您想要完成的任务的说明。您的问题已得到解答。以上是关于SQL如何将值放在一行的主要内容,如果未能解决你的问题,请参考以下文章
react循环多个按钮,这个按钮如何点击一次,将值放在一个数