Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрая группировка - TSQL / 5 сообщений из 5, страница 1 из 1
07.10.2002, 08:34:02
    #32055817
Snark
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка - TSQL
есть такая табличка
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
07.10.2002, 09:35:33
    #32055831
Тимур
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка - TSQL
Думаю, проще всего пробежаться курсором ...
...
Рейтинг: 0 / 0
07.10.2002, 10:12:39
    #32055842
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка - TSQL
Можно и так, раз курсор не катит...
Код: 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
07.10.2002, 10:12:47
    #32055843
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка - TSQL
Можно и так, раз курсор не катит...
Код: 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
07.10.2002, 14:05:22
    #32055974
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрая группировка - TSQL
Без курсора и цикла:
Код: 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрая группировка - TSQL / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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