Как разделить повторяющуюся строку, разделенную запятыми в T-SQL

#sql #sql-server #tsql #mssqlft

#sql #sql-сервер #tsql #mssqlft

Вопрос:

Я пробовал несколько попыток и пока не могу в этом разобраться. Буду признателен за любую помощь.

У меня есть таблица, подобная приведенной ниже.

 LocationID       Project Name
1                A,A
1                A
1                A,B,C
1                A,C
1                B,C
1                C
2                A
2                C,D,E
2                E,F
2                F
3                G,H
3                H
  

Результат, который я ищу, является. Это удаляет все повторения и сохраняет только отдельные значения с их соответствующим идентификатором.

 LocationID       Project Name
1                A
1                B
1                C
2                A
2                C
2                D
2                E
2                F
3                G
3                H
  

Я попытался подсчитать количество запятых с помощью (len(replace(@ProjectNames, ‘,’))

Используя функцию разделения из http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

Однако по-прежнему безуспешно.. Буду признателен за любую помощь. Спасибо.

Ответ №1:

 declare @T table(LocationID int, PName varchar(50))

insert into @T values
(1,                'A,A'),
(1,                'A'),
(1,                'A,B,C'),
(1,                'A,C'),
(1,                'B,C'),
(1,                'C'),
(2,                'A'),
(2,                'C,D,E'),
(2,                'E,F'),
(2,                'F'),
(3,                'G,H'),
(3,                'H')

select distinct
  T.LocationID,
  r.value('.', 'varchar(50)') as [Project Name]
from @T as T
  cross apply
    (select cast('<r>' replace(PName, ',', '</r><r>') '</r>' as xml)) as x(x)
  cross apply
    x.nodes('r') as r(r)
  

Комментарии:

1. Идеальное решение, Майкл. Не могу поверить, что потратил на это 5 часов, а вы решаете ее за короткое время. Похоже, мне нужно многому научиться. Большое спасибо.

Ответ №2:

попробуйте выбрать distinct .

если вы используете mysql, вы можете использовать функцию group_concat() для перегруппировки различных значений.