Coalesce et Pivot dans SQL
-
05-09-2019 - |
Question
Je ne parviens pas à trouver comment coalescent ou pivot sur un jeu d'enregistrements SQL qui ressemble à ceci:
ID VALUE GROUP
3 John 18
4 Smith 18
5 Microsoft 18
3 Randy 21
4 Davis 21
5 IBM 21
etc
et je veux formaté comme ceci
NEWVALUE GROUP
Smith, John (Microsft) 18
Davis, Randy (IBM) 21
Merci pour toutes suggestions et vous aider!
La solution
est ce que je fait, je l'espère pour vous convient
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
Autres conseils
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 vous avez toujours un ensemble de trois de hardcoded de ID
pour chaque _group
, vous pouvez simplement utiliser:
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
Qu'est-ce que vous avez besoin est pas pivoté requête mais une sélection simple avec le groupe par et une fonction de concaténation de chaîne globale. Mais je ne me souviens pas la fonction exacte dans tsql.
Mise à jour: il n'y a pas de fonction de concaténation globale dans tsql mais depuis sql2005 vous pouvez écrire votre propre extension pour mettre en œuvre cette fonction. Il y a beaucoup d'exemples sur la recherche google pour:. Tsql 2005 concaténation exemple global
est un peu hokey, mais je pense que cela devrait fonctionner assez bien pour un petit ensemble de données. Si vous avez beaucoup de données dont vous avez besoin pour créer un curseur et une boucle.
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]