![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 и немного подождать. |