有没有办法在 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()么

PHP cURL,提取 XML 响应

用tomcat部署上java web项目后在地址里输入地址有没有办法不加项目名

在运行 bundle exec rspec file_path --format 文档时,有没有办法保持定义的案例顺序?

有没有办法在 macOS 中解决 git repo 中的长路径的“PATH_MAX”?