如何使用 STRING_AGG() 获取以逗号分隔的升序字符串

asm*_*mgx 1 sql t-sql sql-server string-aggregation string-agg

我的桌子看起来像这样

Color  Order 
------------
Red    49
Blue   32
Green  80
Green  30
Blue   93
Blue   77
Red    20
Green  54
Red    59
Red    42
Red    81
Green  35
Blue   91
Run Code Online (Sandbox Code Playgroud)

我的查询是

SELECT Color, Count(*) AS Count, STRING_AGG(Order,',') AS AggOrder
FROM MyTable
GROUP BY Color
Run Code Online (Sandbox Code Playgroud)

当我按颜色分组并聚合时,我得到未排序的订单

像这样的东西

Color  Count  AggOrder
------------------------------
Red    5      49,20,59,42,81
Blue   4      32,93,77,91
Green  4      80,30,54,35
Run Code Online (Sandbox Code Playgroud)

问题:AggOrder 无序 49,20,59,42,81

我想订购

所以最终结果是

Color  Count  AggOrder
------------------------------
Red    5      20,42,49,59,81
Blue   4      32,77,91,93
Green  4      30,35,54,80
Run Code Online (Sandbox Code Playgroud)

我尝试了这个查询

SELECT Color, Count(*) AS Count, STRING_AGG(Order,',') AS AggOrder
FROM MyTable
GROUP BY Color
ORDER BY Order
Run Code Online (Sandbox Code Playgroud)

但这会产生错误。

知道如何解决这个问题吗?

Tim*_*sen 5

ORDER BY在您的调用中添加一个子句STRING_AGG

SELECT
    Color,
    COUNT(*) AS Count,
    STRING_AGG([Order], ',') WITHIN GROUP (ORDER BY CAST([Order] AS INT)) AS AggOrder
FROM MyTable
GROUP BY Color;
Run Code Online (Sandbox Code Playgroud)

Order专栏有两条评论。首先,ORDER是一个保留的 SQL Server 关键字,您在问题中粘贴的查询甚至不会按给定的方式运行,因为ORDER当用作数据库对象名称时需要转义。您应该避免使用关键字命名您的列、表等。其次,假设Order列是文本,如果您想将其用作数字进行排序,则应首先将其转换为整数。