按内部子查询排序

c44*_*548 3 sql-server

假设我通过从现有表执行分组来选择如下临时表,这是当前的临时表值:

Title Count
-------------
Sr.   11
Mrs.  2
Sra.  3
Ms.   415
Mr.   578
Run Code Online (Sandbox Code Playgroud)

我想要实现的是标题的逗号分隔值,如下所示,按计数排序

[Mrs.], [Sra.], [Sr.], [Ms.], [Mr.]
Run Code Online (Sandbox Code Playgroud)

但是,目前我只能实现以下逗号分隔值,这是#temptable 中的默认排序

[Sr.], [Mrs.], [Sra.], [Ms.], [Mr.]
Run Code Online (Sandbox Code Playgroud)

下面是我的代码。我怎样才能达到我想要的?
注意:在插入#temptable 时,我既不假设也不期望序列已经按顺序排列

DECLARE @Columns as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(Title)
FROM
   (
    SELECT Title FROM #tempTable1
   ) AS P
Run Code Online (Sandbox Code Playgroud)

McN*_*ets 6

您可以这样使用STUFF函数:

DECLARE @Columns nvarchar(max);

SET @Columns = STUFF((SELECT ', ' + QUOTENAME(Title)
                      FROM tempTable1
                      ORDER BY [Count]
               FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'), 1, 1, '');

SELECT @Columns;
Run Code Online (Sandbox Code Playgroud)
| (无列名) |
| :----------------------------------- |
| [夫人], [老], [老], [女士], [先生] |

db<>在这里摆弄

或者,根据您的 SQL-Server 版本,您可以使用STRING_AGG函数:

DECLARE @Columns nvarchar(max);

SELECT
    STRING_AGG(QUOTENAME(Title), ',') WITHIN GROUP (ORDER BY [Count])
FROM
    tempTable1;

SELECT @Columns;
Run Code Online (Sandbox Code Playgroud)

  • 添加带有“ORDER BY”的“XML PATH”或“STRING_AGG”是聚合字符串连接的正确方法。`TOP 100 PERCENT` 方法将使解析器满意,但不能保证排序或正确行为,具体取决于执行计划。 (2认同)