89 votes

SQL Server: combinaison de plusieurs lignes en une seule

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; montrant dans une ligne (cellule) combinés 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?

103voto

Code Magician Points 8724

Il y a plusieurs méthodes.

Si vous souhaitez uniquement renvoyer la valeur de chaîne consolidée, il s'agit d'une bonne approche rapide et simple.

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

SELECT @combinedString as StringValue 
 

Ce qui retournera 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
 

9voto

John Leidegren Points 21951

Il y a un convinent méthode pour cela dans MySql appelée GROUP_CONCAT, l'équivalent de SQL Server n'existe pas, mais vous pouvez écrire votre propre en utilisant le SQLCLR, heureusement que quelqu'un l'a déjà fait pour vous.

Votre requête se transforme alors en ce (qui btw c'est tellement plus agréable de la syntaxe):

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

Mais s'il vous plaît ne pas le suivant, cette méthode est bonne pour les plus de 100 lignes au sein d'un groupe, au-delà de ce que vous allez avoir de gros problèmes de performances. SQLCLR agrégats ont pour sérialiser un des résultats intermédiaires et rapidement que les piles à beaucoup de travail. Gardez cela à l'esprit!

Il est intéressant de noter l' FOR XML ne souffre pas du même problème, mais utilise plutôt que d'horribles de la syntaxe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X