cadena concatenar en grupo por function con otras funciones agregadas

¿Es posible concatenar cadenas con uno o más de otro grupo por function como sum, media, recuento, etc.

Digamos que tengo la siguiente tabla

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

Ahora si quiero que el resultado sea algo de este tipo

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

¿Cómo puedo lograr lo mismo utilizando una consulta en el server SQL?

Mesa de muestra

 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 

Consulta para SQL Server 2005 y superior

 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] 

Salida

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

Intenta usar esto.

  • Coloqué tu consulta original en un CTE.
  • Luego lo seleccioné y agrupé por order.
  • Luego, se aplica una cruz cruzada con una subconsulta que obtiene un set de nombres delimitados por comas para cada order en la consulta externa.
  • Como también seleccioné la columna de nombres, también tuve que agrupar por la columna de nombres.

Me gusta esto:

 ;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 

Si está utilizando MS SQL Server 2005 o posterior, puede crear funciones de agregado definidas por el usuario.

MSDN: CREATE AGGREGATE (Transact-SQL)

MSDN: Invocar funciones agregadas definidas por el usuario de CLR