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 :
SELECT
récupère tous les e-mails associés à un ReportId
spécifique.''
garantit qu'aucun nœud parent n'est créé.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!