|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Несколько строк в одной через запятую
Доброго времени суток.
Delphi, СУБД BDE, Существует данная таблица: Код:
группа имя оценки ====================================== 5 дима 3 5 боря 2 5 саша 4 9 никита 3 9 лёня 5 9 володя 4 9 лаврентий 2 1 петя 5 1 коля 4 задача состоит в том чтобы таблица выглядела в такой форме: Код:
группа имена и оценки ========================================================= 5 дима (3), боря (2), саша (4) 9 никита (3), лёня (5), володя (4), лаврентий (2) 1 петя (5), коля (4) 1) можноли реализовать данную задачку на уровне самого грида, к примеру с помощью Ehlib dbGrid или Quantum Grid от dev express или есть еще что либо подходящее для этого задания. 2) недавно читал про некие запросы которые существуют именно для этой задачки только все они для Firebird и других СУБД и моя старая добрая BDE (dBase и Paradoxы),которую начальство нивкакую не хочет менять =(( и всё таки можно это реализовать с помощью запроса или нет? зы. прогон таблицы по циклу и запись в нее данных програмным путем думаю не вариант тк таблица будет часто обновлятся и грузить саму работу с БД. Последний раз редактировалось centuriy, 03.11.2012 в 18:15. |
#2
|
||||
|
||||
Цитата:
Цитата:
Во-вторых, чтобы получить это дело одним запросом (что теоретически можно), нужен такой матан, как иерархические запросы (connect by и start with) или хотя бы хотя бы grouping rollup. Можно подыскать СУБД с поддержкой этих операторов. Но это будет только эмуляция, и по-любому придется писать многоступенчатый запрос, типа такого: Код:
select case when prior_pos is null then substr(source, 1, pos - 1) when prior_pos = 0 then substr(source, pos - 1) else substr(source, prior_pos + 1, pos - prior_pos - 1) end token from select source, case when connect_by_isleaf = 1 then instr(source, delimiter, -1) when level > 1 then instr(source, delimiter, 1, level - 1) end prior_pos, case when connect_by_isleaf = 1 then case when level > 1 then length(source) + 1 else 1 end else instr(source, delimiter, 1, level) end pos from (trim(both delimiter from source) source from dual) connect by level < instr(source, delimiter, -1) end where pos > 0 order by 1 А агрегация списка в строку встроенной функцией listagg появилась только в Oracle 11g Release 2. Не знаю, насколько она является стандартом на данный момент. До этого наблюдалось, что многие фичи, предложенные и реализованные впервые в Oracle, через какое-то время становились стандартом. Как говорится, нужно отказаться от BDE и немного подождать. |