Agrégation de plusieurs lignes SQL en une seule colonne délimitée par des virgules
Cet article montre comment consolider plusieurs lignes partageant un identifiant commun en une seule ligne avec une liste séparée par des virgules dans une colonne spécifique. L'exemple utilise un tableau avec les ID de ticket et les individus associés, dans le but de créer un résultat où chaque ID de ticket est lié à une liste de tous les individus impliqués.
Approche SQL Server (2005 et versions ultérieures)
La requête SQL Server suivante y parvient en utilisant STUFF()
, ISNULL()
et FOR XML PATH
:
<code class="language-sql">SELECT t.TicketID, STUFF(ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma], ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID</code>
Cette requête utilise une sous-requête pour rassembler les individus associés à chaque TicketID
. La méthode FOR XML PATH
transforme le résultat en une chaîne concaténée et STUFF()
supprime toute virgule de début. La fonction ISNULL()
gère les cas où aucun individu n'est associé à un ticket. Les colonnes facultatives offrent une flexibilité dans la gestion des virgules de début.
Solution Oracle
Oracle propose une solution plus concise en utilisant la fonction LISTAGG()
:
<code class="language-sql">SELECT TicketID, LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People FROM @Tickets</code>
LISTAGG()
regroupe directement les valeurs dans une liste séparée par des virgules, classées par colonne Person
. La clause PARTITION BY
garantit que l'agrégation se produit pour chaque TicketID
distinct. Cette méthode est nettement plus simple et plus efficace que son équivalent SQL Server.
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!