powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрая группировка - TSQL
5 сообщений из 5, страница 1 из 1
Хитрая группировка - TSQL
    #32055817
Snark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такая табличка
ID | Txt
--------
1 | 'D'
2 | 'E'
1 | 'C'
2 | 'A'
2 | 'B'

в результате запроса нужно получить :

ID | Txt
--------
2 | 'A-B-E'
1 | 'C-D'

Суть запроса :
1. Сгруппировать Txt по ID
2. Отсортировать Txt внутри каждой группы
3. Произвести конкатенацию Txt внутри каждой группы
4. Отсортировать выходную таблицу по Txt

Помогите пожалуйста с запросом, желательно без применения курсора

С уважением, Снарк
...
Рейтинг: 0 / 0
Хитрая группировка - TSQL
    #32055831
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, проще всего пробежаться курсором ...
...
Рейтинг: 0 / 0
Хитрая группировка - TSQL
    #32055842
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно и так, раз курсор не катит...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create table #T(n numeric identity, id numeric, text varchar( 20 ))
create table #TOut(id numeric, text varchar( 120 ))
insert into #T select * from TName order by id, text

declare @n numeric, @id numeric, @txt varchar( 120 )
select @n =  1 , @id = min(id), @txt = '' from #T
while @n !> (select max(n) from #T where id = @id)
  begin
    select @txt = @txt + text from #T where id = @id and n = @n 
    if  @n != (select max(n) from #T where id = @id) select @txt = @txt + '-'
      else
        begin
           insert into #TOut values(@id, @txt)
           if @id != (select max(id) from #T)
             begin
               select @id = @id +  1 
               select @txt = ''
             end
        end
    select @n = @n +  1 
  end
select * from #TOut order by text

drop table #T
drop table #TN
...
Рейтинг: 0 / 0
Хитрая группировка - TSQL
    #32055843
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно и так, раз курсор не катит...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create table #T(n numeric identity, id numeric, text varchar( 20 ))
create table #TOut(id numeric, text varchar( 120 ))
insert into #T select * from TName order by id, text

declare @n numeric, @id numeric, @txt varchar( 120 )
select @n =  1 , @id = min(id), @txt = '' from #T
while @n !> (select max(n) from #T where id = @id)
  begin
    select @txt = @txt + text from #T where id = @id and n = @n 
    if  @n != (select max(n) from #T where id = @id) select @txt = @txt + '-'
      else
        begin
           insert into #TOut values(@id, @txt)
           if @id != (select max(id) from #T)
             begin
               select @id = @id +  1 
               select @txt = ''
             end
        end
    select @n = @n +  1 
  end
select * from #TOut order by text

drop table #T
drop table #TN
...
Рейтинг: 0 / 0
Хитрая группировка - TSQL
    #32055974
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без курсора и цикла:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 /*
есть такая табличка 
ID | Txt 
-------- 
1 | 'D' 
2 | 'E' 
1 | 'C' 
2 | 'A' 
2 | 'B' 

в результате запроса нужно получить : 

ID | Txt 
-------- 
2 | 'A-B-E' 
1 | 'C-D' 
*/ 

create table #ishodnaja (id int not null, txt nvarchar( 1 ))
insert into #ishodnaja(id,txt) values( 1 ,'D')
insert into #ishodnaja(id,txt) values( 2 ,'E')
insert into #ishodnaja(id,txt) values( 1 ,'C')
insert into #ishodnaja(id,txt) values( 2 ,'A')
insert into #ishodnaja(id,txt) values( 2 ,'B')

alter table #ishodnaja add aggregate nvarchar( 2000 ) not null default ''

create clustered index tmp_ishodnaja on #ishodnaja(id,txt)
 --Индекс нужен для правильной сортировки
 
GO

DECLARE @id int, @path nvarchar( 3000 )


Update #ishodnaja 
Set 
	@path=aggregate=
		CASE 
			WHEN id=@id THEN @path+'-'+txt 
			ELSE txt 
		END, 
	@id=id

Select id, MAX(aggregate) from #ishodnaja Group By id

drop table #ishodnaja



С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрая группировка - TSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]