有没有办法在 STUFF/FOR XML PATH 中对数值进行排序?
Posted
技术标签:
【中文标题】有没有办法在 STUFF/FOR XML PATH 中对数值进行排序?【英文标题】:is there a way to sort numerical values in STUFF/FOR XML PATH? 【发布时间】:2019-02-12 16:46:38 【问题描述】:我正在使用 STUFF 和 FOR XML PATH 列出列中的值,并且它工作正常。我正在使用 DISTINCT 否则我会得到重复;我唯一的问题是它给了我按字母顺序列出的值,我希望它们按数字列出。例如。我得到“5, 569, 6”,我希望它是“5, 6, 569”。我试过使用 ORDER BY 但这不起作用,因为 DISTINCT. (下面的代码实际上是一个更大的查询的一部分,它有多个连接,这就是为什么我在几个地方都有 DISTINCT。) 请有人能指出我正确的方向吗?
SELECT DISTINCT IndData.UserID,
STUFF ((
SELECT DISTINCT ', ' + CAST(InnerTable.AgentID AS varchar(6))
FROM
IndData AS InnerTable
WHERE InnerTable.UserID = IndData.UserID
FOR XML PATH('')
),1,2,'' )
AS [AgentIDs]
【问题讨论】:
将 order by 添加到您的子查询中。 这是用于聚合字符串的技术之一。 SQL Server 2017。为此引入了STRING_AGG。即使在早期版本中,虽然您可以在内部查询中添加ORDER BY
子句,但在数据被转换为字符串之前。
【参考方案1】:
如果列表中的值已经不同,则可以应用 ORDER BY
,如下所示。
SELECT DISTINCT IndData.UserID,
STUFF ((
SELECT ', ' + CAST(InnerTable.AgentID AS varchar(6))
FROM
IndData AS InnerTable
WHERE InnerTable.UserID = IndData.UserID
ORDER BY InnerTable.AgentID
FOR XML PATH('')
),1,2,'' )
AS [AgentIDs]
Sample Demo
如果 AgentIds 不是不同的,你可以有一个不同记录的内部表,然后你可以放置 ORDER BY,你可以检查以下示例。
Sample 2
【讨论】:
谢谢!我会给你一个赞成票,但我是新手,所以我不能。第一个不起作用,我收到此错误:如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。因此,我使用了您的示例 2,效果很好。在我针对我的情况进行了修改后,它看起来像这样: STUFF (( SELECT ', ' + CAST(AgentID AS varchar(6)) FROM ( SELECT DISTINCT InnerTable.AgentID FROM IndData as InnerTable WHERE InnerTable.UserID = IndData.UserID ) t ORDER BY AgentID FOR XML PATH('') ),1,2,'' ) AS [AgentIDs] 如果要在内部查询中使用order by,则需要删除DISTINCT以上是关于有没有办法在 STUFF/FOR XML PATH 中对数值进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
应用stuff,for xml path,pivot等实现sqlserver行列转换
SQL Server2000将一列数据拼接成字符串可以用STUFF FOR XML PATH()么
用tomcat部署上java web项目后在地址里输入地址有没有办法不加项目名
在运行 bundle exec rspec file_path --format 文档时,有没有办法保持定义的案例顺序?