7

¿Es posible concatenar cadenas con uno o más de otro grupo por función como suma, media, conteo, etc.cadena concatenar en grupo por función con otras funciones de agregado

Decir 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 conseguir el mismo mediante una consulta SQL en el servidor.

Respuesta

7

Tabla de muestras

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 

de consultas para SQL Server 2005 y por encima de

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

Can u explicar qué demonios está pasando aquí .. mi tabla no es una mesa real, es un conjunto de resultados de unión de varias tablas. – Sarah

4

Trate de usar esto.

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

De esta manera:

;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 
Cuestiones relacionadas