Показать сообщение отдельно
  #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 и немного подождать.
Ответить с цитированием