7

是否可以通过 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 服务器上的查询来实现相同的目标。

4

3 回答 3

7

样品表

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
于 2011-04-06T22:31:29.237 回答
4

尝试使用这个。

  • 我将您的原始查询放在 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
于 2011-04-08T06:34:37.023 回答
1

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

MSDN:创建聚合 (Transact-SQL)

MSDN:调用 CLR 用户定义的聚合函数

于 2011-04-08T06:12:56.013 回答