Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Собрать колонки в строку / 14 сообщений из 14, страница 1 из 1
23.12.2013, 16:56
    #38510200
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Adaptive Server Enterprise/15.5/EBF 20636 SMP ESD#5.2/P/x86_64/Enterprise Linux/asear155/2602/64-bit/FBO/Sun Dec 9 15:11:04 2013

есть табличка вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table #ExTable
      (ID int
       ,Kod varchar(10))

insert #ExTable
select 1,'1'
union all
select 1,'2'
union all
select 1,'2'
union all
select 1,'4'
union all
select 1,'5'
 



В результате нужно увидеть:
112345

Пытался написать через курсор, но интерпретатор не дает разбить на разные пачки и ругается:

Код: sql
1.
DECLARE CURSOR must be the only statement in a query batch
...
Рейтинг: 0 / 0
23.12.2013, 19:53
    #38510405
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Не совсем понятно, почему нужно увидеть

12 3 45

логично предположить, что вместо тройки должна быть вторая двойка.
Но должно вот это помочь:
http://www.sql.ru/faq/faq_topic.aspx?fid=241
...
Рейтинг: 0 / 0
23.12.2013, 19:54
    #38510407
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Или предполагается группировка по первому столбцу?
...
Рейтинг: 0 / 0
23.12.2013, 21:53
    #38510482
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Mikle83Или предполагается группировка по первому столбцу?

Так точно, изначально пример был богаче на айдишники в первом столбце, потом упростил задачи и предложенный вариант может решить проблему.

Но как быть, если нужно выполнить такую компоновку, без использования курсора, для нескольких объектов\айдишников?
...
Рейтинг: 0 / 0
23.12.2013, 21:53
    #38510483
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Mikle83Не совсем понятно, почему нужно увидеть

12 3 45

логично предположить, что вместо тройки должна быть вторая двойка.
Но должно вот это помочь:
http://www.sql.ru/faq/faq_topic.aspx?fid=241

Опечатка, прошу прощения
...
Рейтинг: 0 / 0
23.12.2013, 21:57
    #38510484
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Ну вот например. Решение без курсоров.
Код: sql
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
/* How to transform table like
 +-----+-----+
 | grp | txt |
 +-----|-----+
 |  A  | aaa |
 |  A  | bbb |
 |  B  | ccc |
 +-----+-----+
  into table like this:
 +-----+------+------+
 | grp | txt1 | txt2 |
 +-----+------+------+
 |  A  |  aaa |  bbb |
 |  B  |  ccc |      |
 +-----+------+------+

 ESSENTIAL!:
 All rows in the source table should have a clear ordering.
 In the example group A has two rows, data from which row should go into txt1 and which into txt2?
*/

-- sample data
create table #source(
	grp  char(1) not null,
	txt  varchar(3) not null
)
go
insert into #source values('A', 'aaa')
insert into #source values('A', 'bbb')
insert into #source values('B', 'ccc')
go


-- first step: create a temporary table where each row in a group has a number
select *,
	pos = ( select count(*)+1 from #source s2 where s2.grp=s1.grp and s2.txt<s1.txt )
into #numbered_source
from #source s1
go

-- second step: create the target table
create table #target (
	grp  char(1) not null,
	txt1 varchar(3) null,
	txt2 varchar(3) null
)
go

-- third step: fill target with primary data
insert into #target(grp)
select grp
from #numbered_source
where pos=1

-- last step
update #target set txt1=txt from #numbered_source where #target.grp=#numbered_source.grp and pos=1
update #target set txt2=txt from #numbered_source where #target.grp=#numbered_source.grp and pos=2

-- final result
select * from #target
...
Рейтинг: 0 / 0
24.12.2013, 09:28
    #38510714
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
White Owl,
как это сработает для
Код: sql
1.
2.
3.
4.
5.
insert into #source values('A', 'aaa')
insert into #source values('A', 'aaa')
insert into #source values('A', 'aaa')
insert into #source values('B', 'ccc')
go



которое должно выйти в
"А""ааааааааа""В""ссс"?
...
Рейтинг: 0 / 0
24.12.2013, 10:21
    #38510763
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
White Owl,

По хорошему оно не работает даже так:
Код: sql
1.
2.
3.
4.
insert into #source values('A', 'aaa')
insert into #source values('A', 'aaa')
insert into #source values('B', 'ccc')
go


даже в контексте той задачи, которая описана, так как нет:
Код: sql
1.
-- All rows in the source table should have a clear ordering.
...
Рейтинг: 0 / 0
24.12.2013, 22:16
    #38511572
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Azvaalдаже в контексте той задачи, которая описана, так как нет:
Код: sql
1.
-- All rows in the source table should have a clear ordering.

И что в этой фразе тебе непонятно?
Будет порядок - будет работать. Не будет порядка - не будет работать.
Да хотя бы по PK отсортируй.
...
Рейтинг: 0 / 0
24.12.2013, 22:49
    #38511592
vologdabobr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
Не видел близко ASE, но в ASA есть функция LIST(column,delimited).
Попробуйте
select ID,LIST(KOD,'') from #EXTABLE;
...
Рейтинг: 0 / 0
25.12.2013, 06:49
    #38511704
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
vologdabobrНе видел близко ASE, но в ASA есть функция LIST(column,delimited).
Попробуйте
select ID,LIST(KOD,'') from #EXTABLE;В ASE такой функции нет.
...
Рейтинг: 0 / 0
25.12.2013, 09:04
    #38511734
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
vologdabobr,

vologdabobrНе видел близко ASE, но в ASA есть функция LIST(column,delimited).
Попробуйте
select ID,LIST(KOD,'') from #EXTABLE;

Не сыпьте соль на рану!
http://scn.sap.com/thread/3459526
...
Рейтинг: 0 / 0
25.12.2013, 09:51
    #38511756
Azvaal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
White Owl,
Что такое РК?

и повторюсь, при наличии 2-х одинаковых строк в столбце kod скрипт работать не будет, а у меня такая ситуация возможна.
...
Рейтинг: 0 / 0
25.12.2013, 21:58
    #38512566
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Собрать колонки в строку
AzvaalWhite Owl,
Что такое РК?Primary Key

Azvaalи повторюсь, при наличии 2-х одинаковых строк в столбце kod скрипт работать не будет, а у меня такая ситуация возможна.В нормальной таблице наличие двух одинаковых строк невозможно.
Если в таблице могут быть две одинаковые строки - создателя таблицы надо уволить с волчьим билетом и желательно через четвертование. Гильотина тоже возможна, но она излишне гуманна для людей которые делают таблицы без PK.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Собрать колонки в строку / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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