Maison >base de données >tutoriel mysql >Comment concaténer plusieurs lignes dans une liste séparée par des virgules dans SQL Server et Oracle ?

Comment concaténer plusieurs lignes dans une liste séparée par des virgules dans SQL Server et Oracle ?

DDD
DDDoriginal
2025-01-21 06:42:12800parcourir

How to Concatenate Multiple Rows into a Comma-Separated List in SQL Server and Oracle?

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!

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