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 中生成一个相同的UserIDs 列表(在原始查询中每次出现一个给定的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循环多个按钮,这个按钮如何点击一次,将值放在一个数

使用相同的主键将值从一行添加到另一行 - Oracle SQL

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

sql 如何将值与SQL进行比较?

如何将值插入单链表