SQL Server: combinaison de plusieurs lignes en une seule ligne

J'ai une requête SQL comme celle-ci;

SELECT * 
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

Et ce sont les résultats;

entrez la description de l'image ici

Ce que je veux, c'est; montrer dans une ligne (cellule) combiné tous les STRINGVALUE et ils sont séparés par une virgule. Comme ça;

SELECT --some process with STRINGVALUE--
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

Araç Listesi (C2, K1 vb.Belgeler; yoksa Ruhsat Fotokopileri), Min. 5
araç plakası için İnternet Sorgusu, Son 3 Yıla Ait Onaylı Yıl Sonu
Bilanço + Gelir Tablosu, Son Yıl (Yıl Sonuna ait) Detay Mizanı, İçinde
Bulunduğumuz Yıla ait Ara Dönem Geçici Vergi Beyannamesi, Bayi Yorum
E-Maili, Proforma Fatura

Comment puis-je faire ça?

53
demandé sur Soner Gönül 2011-11-04 11:00:37

5 réponses

Il existe plusieurs méthodes.

Si vous voulez juste la valeur de chaîne consolidée retournée, c'est une bonne approche rapide et facile

DECLARE @combinedString VARCHAR(MAX)
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue
FROM jira.customfieldValue
WHERE customfield = 12534
    AND ISSUE = 19602

SELECT @combinedString as StringValue 

Qui renverra votre chaîne combinée.

Vous pouvez également essayer l'une des méthodes XML par exemple

SELECT DISTINCT Issue, Customfield, StringValues
FROM Jira.customfieldvalue v1
CROSS APPLY ( SELECT StringValues + ',' 
              FROM jira.customfieldvalue v2
              WHERE v2.Customfield = v1.Customfield 
                  AND v2.Issue = v1.issue 
              ORDER BY ID 
                  FOR XML PATH('') )  D ( StringValues )
WHERE customfield = 12534
    AND ISSUE = 19602
71
répondu Code Magician 2016-04-16 10:37:25

Vous pouvez réaliser ceci est de combiner pour le chemin XML et les choses comme suit:

SELECT (STUFF((
        SELECT ', ' + StringValue
        FROM Jira.customfieldvalue
        WHERE CUSTOMFIELD = 12534
        AND ISSUE = 19602
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS StringValue
15
répondu Karthikeyan P 2015-07-16 10:35:03

Il existe une méthode pratique pour cela dans MySql appelée GROUP_CONCAT. Un équivalent pour SQL Server n'existe pas, mais vous pouvez écrire le vôtre en utilisant le SQLCLR. Heureusement quelqu'un déjà fait pour vous.

Votre requête se transforme alors en ceci (qui btw est une syntaxe beaucoup plus agréable):

SELECT CUSTOMFIELD, ISSUE, dbo.GROUP_CONCAT(STRINGVALUE)
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602
GROUP BY CUSTOMFIELD, ISSUE

Mais veuillez noter que cette méthode est bonne pour au plus 100 lignes dans un groupe . Au-delà de cela, vous aurez des problèmes de performance majeurs. Les agrégats SQLCLR doivent sérialiser tout des résultats intermédiaires et qui accumulent rapidement beaucoup de travail. Gardez cela à l'esprit!

Fait intéressant, le FOR XML ne souffre pas du même problème mais utilise plutôt cette syntaxe horrible.

9
répondu John Leidegren 2015-10-05 21:19:41

L'utilisation de la fonction intégrée MySQL group_concat () sera un bon choix pour obtenir le résultat souhaité. La syntaxe sera -

SELECT group_concat(STRINGVALUE) 
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602

Avant d'exécuter la commande ci-dessus, assurez-vous d'augmenter la taille de group_concat_max_len sinon la sortie entière peut ne pas tenir dans cette cellule.

Pour définir la valeur de group_concat_max_len, exécutez la commande ci-dessous-

SET group_concat_max_len = 50000;

Vous pouvez modifier la valeur 50000 en conséquence, vous l'augmentez à une valeur plus élevée comme requis.

1
répondu Rito 2016-08-01 13:11:40

Je crois pour les bases de données qui prennent en charge listagg fonction, vous pouvez faire:

select id, issue, customfield, parentkey, listagg(stingvalue, ',') within group (order by id)
from jira.customfieldvalue
where customfield = 12534 and issue = 19602
group by id, issue, customfield, parentkey
1
répondu Liang 2017-10-27 18:02:37