【问题标题】:string concatenate in group by function with other aggregate functions按函数与其他聚合函数在组中连接字符串
【发布时间】:2011-07-31 05:16:41
【问题描述】:

是否可以通过 sum、avg、count 等函数将字符串与一个或多个其他组连接起来。

假设我有下表

Id Name Order Value  
1  a    1     100  
2  b    2     200  
3  c    1     300  
4  d    1     100  
5  e    2     300

现在如果我希望结果是这样的

Order Name   Value Count  
1     a,c,d  500   3  
2     b,e    500   2  

我怎样才能在 SQL 服务器上使用查询来达到同样的效果。

【问题讨论】:

    标签: sql sql-server tsql aggregate-functions sql-server-group-concat


    【解决方案1】:

    示例表

    create table t123 (Id int, Name varchar(10), [Order] int, Value int)
    insert t123 select 
    1,'a','1',100 union all select
    2,'b','2',200 union all select
    3,'c','1',300 union all select
    4,'d','1',100 union all select
    5,'e','2',300
    

    查询 SQL Server 2005 及更高版本

    select a.[order], STUFF((
        select ','+b.name
        from t123 b
        where b.[order] = a.[order]
        order by b.name
        for xml path('a'), type).value('.','nvarchar(max)'),1,1,'') Name,
        SUM(a.value) value,
        COUNT(*) [count]
    from t123 a
    group by a.[order]
    

    输出

    order       Name         value       count
    ----------- ------------ ----------- -----------
    1           a,c,d        500         3
    2           b,e          500         2
    

    【讨论】:

    • 你能解释一下这里到底发生了什么......我的表不是真正的表,它是多个表连接的结果集。
    【解决方案2】:

    尝试使用它。

    • 我将您的原始查询放在 CTE 中。
    • 然后我从中选择,并按顺序分组。
    • 然后我交叉应用了一个子查询,该子查询为外部查询中的每个订单获取一组以逗号分隔的名称。
    • 由于我还选择了名称列,因此我还必须按名称列进行分组。

    像这样:

    ;WITH cte(id, n, o, v) as (
       SELECT Id, Name, Order, Value FROM ....
    )
    SELECT o, names, SUM(v), COUNT(*)
    FROM cte AS outer
    CROSS APPLY (
        SELECT Name+',' 
        FROM cte AS inner 
        WHERE outer.o = inner.o 
        ORDER BY Name FOR XML PATH('')
    ) n(names)
    group by o, names
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 MS SQL Server 2005 或更新版本,您可以创建用户定义的聚合函数。

      MSDN: CREATE AGGREGATE (Transact-SQL)

      MSDN: Invoking CLR User-Defined Aggregate Functions

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多