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

Откуда:
Сообщений: 42
Не могу сообразить как реализовать подобие конструкции
select sum(a),b group by b  

Только в а это обычный varchar. Иными словами нужно занести в одну ячейку список скажем городов через ";"
25 май 15, 09:13    [17683702]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация строк с использованием group by  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT
	  b
	, a = STUFF((
			SELECT ';' + a
			FROM dbo.t_table t2
			WHERE t1.b = t2.b
			FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM (
	SELECT DISTINCT b
	FROM dbo.t_table
) t1


Можно почитать и про другие способы тут
25 май 15, 09:23    [17683750]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация строк с использованием group by  [new]
Михаил11111
Member

Откуда:
Сообщений: 42
Спасибо то, что нужно. В идеале фунцию хочется сделать свою.
25 май 15, 09:31    [17683772]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация строк с использованием group by  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Рад был помочь.

Относительно своей функции - много уже готовых CLR сборок для конкатенации строк.
25 май 15, 09:36    [17683812]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация строк с использованием group by  [new]
Valer
Member

Откуда:
Сообщений: 278
declare @mt table( id int, name varchar(50) )
insert into @mt ( id,name) values ( 1, 'мама')
insert into @mt ( id,name) values ( 1, 'мыла')
insert into @mt ( id,name) values ( 1, 'раму')
insert into @mt ( id,name) values ( 2, 'фио')
insert into @mt ( id,name) values ( 2, 'адрес')
insert into @mt ( id,name) values ( 2, 'паспорт')
insert into @mt ( id,name) values ( 3, 'group by')
insert into @mt ( id,name) values ( 3, 'varchar()')
insert into @mt ( id,name) values ( 2, 'индекс ')
;
with  
first_npp as (
  select id 
  , name 
  , row_number() over ( partition by id  order by id ) as npp   from @mt  
),
 first1 as (
   select id, name , npp 
     from first_npp 
	 where npp = 1
),
 first_max as (
   select id,  max(npp ) as npp
     from first_npp 
	 group by id
),
 first_plus as (
   select id
       , convert( varchar(100), name ) as name
	   , npp 
      from first1
    union all 
	select   f.id
	 , convert( varchar(100),f.name +';' + i.name )
	 , f.npp+1 
	 from first_plus f
	 inner join first_npp i
	   on i.id = f.id
	   and i.npp = f.npp  + 1
 )
select m.id, f.name  
  from  first_plus f
  inner join first_max m
   on m.id =f.id
     and m.npp = f.npp
 order by id
 
25 май 15, 14:21    [17685484]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить