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!

Était-ce utile?

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top