Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Advantage Database Server > GROUP_CONCAT в ADS


Автор: sinepolsky 16.7.2015, 16:30
В MySQL есть полезная агрегатная строковая функция http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat . 
Суть в следующем: например, есть в таблице t такие записи 
t
+--+--+
|a |b |
+--+--+
|01|10|
|01|11|
|01|15|
|01|19|
|02|22|
|02|25|
|02|27|
|02|28|
+--+--+

Выполнение запроса
SELECT a,GROUP_CONCAT(b WITH SEPARATOR ',') as G from t GROUP BY a
дает следующий результат
+--+-----------+
|a |     G     |
+--+-----------+
|01|10,11,15,19|
|02|22,25,27,28|
+--+-----------+

Как такую возможность реализовать в Advantage Database Server или есть ли там нечто похожее?

Автор: sinepolsky 25.3.2021, 12:54
Сам спросил, сам ответил  smile 
Спустя 6 лет ответ был найден.  smile 
Отдельной функции нет, но есть возможность через курсор пройтись по строкам и записывать в результирующую таблицу.

Код

declare @c cursor;
try drop table #t; drop table #result; catch all end try;

/*исходная таблица */
create table #t(
  id integer,
  val char(32) /* строки, что будут склеиваться для каждого разного id*/
);

/*результат*/
create table #result(
  id integer,
  group_val memo 
  /*если длина склеенной строки неизвестна - тип memo, хотя можно, например, char(256)*/
);

/*Данные для примера*/
insert into #t(id) values(5);  
insert into #t values(1,'x');
insert into #t values(1,'y');
insert into #t values(2,'a');
insert into #t values(2,'c');
insert into #t values(2,'b');
insert into #t values(3,'t');
insert into #t(id) values(4);
insert into #t values(4,'v');

open @c as select * from #t /*можно поиграться с ORDER BY, тут не важно*/ ;
while fetch @c do
 IF (select count(*) from #result where [email protected])=0 THEN
   /*если значения еще не было - добавление с проверкой на NULL*/
   insert into #result(id,group_val) 
     values(@c.id, trim(isnull(@c.val,'')));
 ELSE
   /*если было - обновляем поле, склеиваем строки с разделителем запятая (,)*/
   update #result set group_val = isnull(group_val,'') 
     + iif(length(isnull(group_val,''))=0,'',',')
     + trim(isnull(@c.val,''))
   where [email protected];  
 END IF;      
end while;
close @c;

/*РЕЗУЛЬТАТ*/
select* from #result;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)