Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

diviser la valeur séparée par une virgule de la table dans le serveur sql

Vous pouvez extraire les noms à l'aide d'un CTE récursif et d'une analyse de chaîne. Le reste n'est que de l'agrégation :

with cte as (
      select (case when names like '%,%'
                   then left(names, charindex(',', names) - 1)
                   else names
              end) as name,
             (case when names like '%,%'
                   then substring(names, charindex(',', names) + 1, len(names))
              end) as names
      from names
      union all
      select (case when names like '%,%'
                   then left(names, charindex(',', names) - 1)
                   else names
              end) as name,
             (case when names like '%,%'
                   then substring(names, charindex(',', names) + 1, len(names))
              end)
      from cte
      where names is not null
     )
select name, count(*)
from cte
group by name;

Comme vous l'avez probablement compris, stocker des listes délimitées par des virgules dans SQL Server est une mauvaise idée. Vous devriez avoir une table d'association/jonction avec une ligne par nom (et d'autres colonnes décrivant la liste dans laquelle il se trouve).