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