Maison >base de données >tutoriel mysql >Comment puis-je concaténer plusieurs valeurs dans une chaîne séparée par des virgules à l'aide de GROUP BY dans SQL Server ?

Comment puis-je concaténer plusieurs valeurs dans une chaîne séparée par des virgules à l'aide de GROUP BY dans SQL Server ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-10 17:37:45274parcourir

How Can I Concatenate Multiple Values into a Comma-Separated String Using GROUP BY in SQL Server?

Agrégation de données avec des chaînes séparées par des virgules dans SQL Server

La clause GROUP BY de SQL Server est excellente pour l'agrégation de données. Mais comment combiner plusieurs valeurs de lignes regroupées en une seule chaîne séparée par des virgules ?

Le défi :

Imaginez une table comme celle-ci :

<code>ID    ReportId     Email
1     1            a@domain.com
2     2            b@domain.com
3     1            c@domain.com
4     3            d@domain.com
5     3            e@domain.com</code>

L'objectif est de regrouper par ReportId et de concaténer les e-mails dans une liste séparée par des virgules pour chaque rapport.

Solution : Sous-requête et FOR XML PATH

Voici comment y parvenir à l'aide d'une sous-requête et de la méthode FOR XML PATH :

<code class="language-sql">SELECT ReportId, Email = 
    STUFF((SELECT ', ' + Email
           FROM table_name b 
           WHERE b.ReportId = a.ReportId 
          FOR XML PATH('')), 1, 2, '')
FROM table_name a
GROUP BY ReportId;</code>

Explication :

  • Sous-requête : L'instruction interne SELECT récupère tous les e-mails associés à un ReportId spécifique.
  • POUR XML PATH(''): Cette fonction convertit les résultats de l'e-mail en une chaîne XML, avec chaque e-mail comme un nœud distinct. Le '' garantit qu'aucun nœud parent n'est créé.
  • STUFF : La fonction STUFF supprime la virgule de début et l'espace ajoutés par l'instruction SELECT, ce qui donne une chaîne propre séparée par des virgules.

Résultat :

La requête produira le résultat suivant :

<code>ReportId     Email
1            a@domain.com, c@domain.com
2            b@domain.com
3            d@domain.com, e@domain.com</code>

Cela consolide efficacement plusieurs adresses e-mail en une seule chaîne séparée par des virgules pour chacune ReportId. Bien que cette approche fonctionne bien, envisagez d'explorer d'autres fonctions spécifiques à la base de données telles que STRING_AGG (disponible dans les versions ultérieures de SQL Server) pour des solutions potentiellement plus efficaces.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn