powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Собрать колонки в строку
14 сообщений из 14, страница 1 из 1
Собрать колонки в строку
    #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
Собрать колонки в строку
    #38510405
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятно, почему нужно увидеть

12 3 45

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

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

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

12 3 45

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

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

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

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

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

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

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


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