Pregunta

Estoy teniendo problemas para averiguar cómo se aglutinan o pivote en un conjunto de registros de SQL que tiene este aspecto:

ID      VALUE       GROUP
3       John        18
4       Smith       18
5       Microsoft   18
3       Randy       21
4       Davis       21
5       IBM     21
etc

y quiero formateado como esto

NEWVALUE                GROUP
Smith, John (Microsft)      18
Davis, Randy (IBM)          21  

gracias por todas las sugerencias y ayuda!

¿Fue útil?

Solución

Esto es lo que he hecho, espero que se adapta para usted

DECLARE @t table (id int, value VARCHAR(20), grupo int)
INSERT @T VALUES (3, 'John', 18)
INSERT @T VALUES (4, 'Smith', 18)
INSERT @T VALUES (5, 'Microsoft', 18)
INSERT @T VALUES (3, 'Randy', 21)
INSERT @T VALUES (4, 'Davis', 21)
INSERT @T VALUES (5, 'IBM', 21)


SELECT grupo, (SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 4) + ', ' + 
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 3) + ' (' +
(SELECT value FROM @t t2 WHERE t2.grupo = t.grupo AND id = 5) + ')'
FROM @t t 
GROUP BY grupo

Otros consejos

SELECT  LEFT(gvalue, LEN(gvalue) - 1) AS newvalue, _group
FROM    (
        SELECT  DISTINCT _group
        FROM    mytable
        ) qo
CROSS APPLY
        (
        SELECT  value + ', '
        FROM    mytable qi
        WHERE   qi._group = qo._group
        FOR XML PATH ('')
        ) gr(qvalue)

Si usted siempre tiene un conjunto de tres codificados de ID para cada _group, sólo puede utilizar:

SELECT m3._group, m3.value + ', ' + m4.value + '(' + m5.value + ')' AS newvalue
FROM   mytable m3
LEFT JOIN
       mytable m4
ON     m4._group = m3.group
LEFT JOIN
       mytable m5
ON     m5._group = m3.group
WHERE  m3.id = 3
       AND m4.id = 4
       AND m5.id = 5

Lo que se necesita no es pivotado consulta pero un simple selecciona con GROUP BY y una función de concatenación de cadenas de agregado. Pero no recuerdo la función exacta en tsql.

Actualización: no hay ninguna función de concatenación agregada en tsql pero desde sql2005 usted puede escribir su propia extensión para implementar dicha función. Hay un montón de ejemplos en búsqueda de Google:. Tsql 2005 concatenación ejemplo agregada

Esto es un poco mal, pero creo que debería funcionar razonablemente bien para un pequeño conjunto de datos. Si usted tiene una gran cantidad de datos que necesita para crear un cursor y un bucle.

select max(case when ID = 4 then VALUE else null end) + ', ' + 
    max(case when ID = 4 then VALUE else null end) + '( ' +
    max(case when ID = 5 then VALUE else null end) + ') as NEWVALUE,
    [GROUP]
group by [GROUP]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top