Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка с конкатенацией  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Помогите пожалуйста решить задачку.
имею таблицу с двумя столбцам в первом
номера (bigint) которые могут повторяться. Во
втором текст (nvarchar). Необходимо
сгруппировать строки по первому столбцу (так
что бы получить уникальные индексы) во втором же столбце должна отображаться
конкатенация всех строк (с разделителями)
полученных при группировке.
11 ноя 13, 09:00    [15106777]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с конкатенацией  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
Пока реализовал такой вот г..код:
With CTE as
(
Select iNodeElementID,  num, strSource 
From (
      SELECT [iNodeElementID], STR(ROW_NUMBER() over(Partition by iNodeElementID Order by strSource)) num, 
              STR(ROW_NUMBER() over(Partition by iNodeElementID Order by strSource)) + '. ' + strSource as strSource
      FROM [BASE].[dbo].[tblNodeSource] NS
      Join Base.dbo.tblSource S
      On NS.iSource = S.iSource
      )a)
  
Select Distinct iNodeElementID,
Case Max (num) over (partition by iNodeElementID)
When 1 then strSource
When 2 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num = 2)
When 3 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+ 
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3)
When 4 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =4)
When 5 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =4) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =5)
When 6 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =4) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =5) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =6)
When 7 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =4) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =5) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =6) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =7)
When 8 then (Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =1) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =2) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =3) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =4) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =5) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =6) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =7) + ';' + char(10) + char(13)+
(Select strSource From CTE Where iNodeElementID = C1.iNodeElementID And num =8)
Else 'Х/З'
End Sss
From CTE C1

Минусы - ограничение по количеству записей для одного ID (в зависимости от того сколько задано в CASE... в принципе вряд ли будет более трех позиций для одного ID, но тем не менее) и громоздкость.
11 ноя 13, 09:36    [15106896]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с конкатенацией  [new]
kalakhary
Member

Откуда:
Сообщений: 17
так?

create table #t (id int, str_text varchar(10))
insert into #t values (1, 'a')
insert into #t values (2, 'b')
insert into #t values (3, 'c')
insert into #t values (1, 'd')
insert into #t values (2, 'e')
insert into #t values (3, 'f')

select id ,( select str_text + '; ' as 'data()' from #t t2 where t1.id=t2.id for xml path('') )
from #t t1
group by id

drop table #t
11 ноя 13, 09:37    [15106898]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с конкатенацией  [new]
Изерлонер
Member

Откуда: СФО
Сообщений: 1269
... Так... Ничего себе! Как это работает?
11 ноя 13, 10:05    [15107028]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с конкатенацией  [new]
kalakhary
Member

Откуда:
Сообщений: 17
Изерлонер,
вот тут были еще варианты решения вашей задачи https://www.sql.ru/faq/faq_topic.aspx?fid=130
успехов :)
11 ноя 13, 10:14    [15107059]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить