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 Server的查询实现相同的。

回答

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 
+2

u能请解释一下到底是怎么回事呢..我的表是不是一个真正的表,它从多个表的连接的结果集。 – Sarah 2011-04-06 23:13:25

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