Unirse y pivote en SQL
-
05-09-2019 - |
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!
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]