【问题标题】:SQL how to put values on one lineSQL如何将值放在一行
【发布时间】: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 很多次。您应该提出一个新问题,其中包含样本数据、期望的结果以及您想要完成的任务的解释。

标签: sql sql-server string tsql aggregate-functions


【解决方案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 。 . .问一个新的问题。提供样本数据、期望的结果以及您想要完成的任务的说明。您的问题已得到解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多