Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #2  
Старый 04.11.2012, 02:08
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от centuriy
1) можноли реализовать данную задачку на уровне самого грида,
Конкретно с навороченными гридами не работал, но в общем случае кажется что вряд ли, так как задача в извлечении данных, а не в их показе.

Цитата:
Сообщение от centuriy
2) недавно читал про некие запросы которые существуют именно для этой задачки
Во-первых, есть такая штука, как group by, и она вроде даже работает и в BDE, и вроде даже и для DBF. Поэтому получить предварительную группировку по оценкам можно, и собирать в строку уже придется по результирующему набору данных, число строк в котором будет равно числу учеников.

Во-вторых, чтобы получить это дело одним запросом (что теоретически можно), нужен такой матан, как иерархические запросы (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 и немного подождать.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:26.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025