【问题标题】:Select distinct with order by in stuff function在填充功能中使用 order by 选择不同的
【发布时间】:2021-09-23 19:12:28
【问题描述】:

我想知道是否可以根据另一列重新排序 stuff 函数中的串联单元格。

截至目前,我正在使用以下查询

SELECT 
    Id, 
    KPI = STUFF((SELECT DISTINCT ', ' + Name
                 FROM #TempTable1 b 
                 WHERE b.Id = a.Id 
                 FOR XML PATH('')), 1, 2, '')

但这会按字母顺序输出。我想根据 ID 列订购。

以下是我的查询结果

我想订购它的质量分数,准确度。这是基于 ORDERID 的另一列

【问题讨论】:

  • 你的 SQL Server 是什么版本?
  • 如果您在 STUFF 中的 SELECT 语句中设置 order by 会发生什么?你有错误吗?
  • WHERE 子句之后添加ORDER BY 1
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql distinct stuff


【解决方案1】:

你需要做三件事:

  • ORDER BY 子句添加到您现有的子查询中,该子查询用于向FOR XML PATH 提供行。
  • 删除聚合的DISTINCT 并替换为GROUP BY
  • 确定OrderID 应如何影响输出中Name 的顺序。

目前您的子查询使用DISTINCT 运算符,这是一个聚合。为了在ORDER BY 子句中访问OrderID 的值,您需要将其聚合到与当前输出相同的级别,即Name。由于看起来每个Name 值可以有多个OrderID 值,因此您必须确定聚合OrderID 值以影响此查询中最终输出的顺序的意义。一个例子可能是使用MIN 来聚合它。

下面的完整示例:

SELECT 
    Id, 
    KPI = STUFF((SELECT ', ' + Name
                 FROM #TempTable1 b 
                 WHERE b.Id = a.Id 
                 GROUP BY Name 
                 ORDER BY MIN(OrderId)
                 FOR XML PATH('')), 1, 2, '')

【讨论】:

  • 感谢您的帮助以及有关其工作原理的详细说明!这真的有助于我正确理解问题!非常感谢!
  • 我很高兴这有帮助。如果这解决了您的问题,请将其标记为答案。谢谢!
猜你喜欢
  • 2012-06-08
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多