1

我的桌子看起来像这样

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

我的查询是

SELECT Color, Count(*) AS Count, STRING_AGG(Order,',') AS AggOrder
FROM MyTable
GROUP BY Color

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

像这样的东西

Color  Count  AggOrder
------------------------------
Red    5      49,20,59,42,81
Blue   4      32,93,77,91
Green  4      80,30,54,35

问题: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

我试过这个查询

SELECT Color, Count(*) AS Count, STRING_AGG(Order,',') AS AggOrder
FROM MyTable
GROUP BY Color
ORDER BY Order

但这给出了一个错误。

知道如何解决吗?

4

3 回答 3

4

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;

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

于 2021-03-30T03:03:44.143 回答
3

您可以使用within group语法

SELECT Color
    , Count(*) AS Count
    , STRING_AGG([Order],',') WITHIN GROUP (ORDER BY [Order]) AS AggOrder
FROM MyTable
GROUP BY Color
于 2021-03-30T03:02:48.093 回答
1

对于 SQL Server 2017 或更高版本,您已经得到了答案。但是,如果 SQL Server 比 2017 年旧,您可以使用 stuff() 和 XML PATH FOR() 来获得您想要的结果:

由于您使用的是 SQL Server 2017 或更高版本,请不要使用此解决方案,而是使用带有 string_agg() 的解决方案,因为该解决方案更快且易于实施。

架构:

 create table MyTable (color varchar(10), [order] int);
 insert into MyTable  values('Red',    49);
 insert into MyTable  values('Blue',   32);
 insert into MyTable  values('Green',  80);
 insert into MyTable  values('Green',  30);
 insert into MyTable  values('Blue',   93);
 insert into MyTable  values('Blue',   77);
 insert into MyTable  values('Red',    20);
 insert into MyTable  values('Green',  54);
 insert into MyTable  values('Red',    59);
 insert into MyTable  values('Red',    42);
 insert into MyTable  values('Red',    81);
 insert into MyTable  values('Green',  35);
 insert into MyTable  values('Blue',   91);

询问:

 SELECT color,count(*) [Count],
    STUFF((SELECT ',' + COALESCE(LTRIM(RTRIM([order])), '') 
    FROM MyTable mt 
        WHERE mt.color = m.color
        order by [order]
    FOR XML PATH('') ), 1, 1, ''
    ) as AggOrder
 FROM MyTable m
 group by color
 

输出:

颜色 数数 聚合订单
蓝色的 4 32,77,91,93
绿色的 4 30,35,54,80
红色的 5 20,42,49,59,81

db<>在这里摆弄

于 2021-03-30T04:21:39.487 回答