Найти в Дзене
rustabapclub

Способы группировки в ABAP: 3 + 1 способ

При обработке данных иногда требуется сгруппировать данные и посчитать какое-либо агрегированное значение (MAX, MIN, AVG, SUM, COUNT и другие). Традиционно, такие функции реализуются в SQL; однако и на сервере приложений приходится выполнять такие вычисления. В ABAP имеется 3 стандартных способа (встроенных) для группировки с последующим вычислением агрегированных значений, а именно: 1) Группировка с помощью ключей сортированной таблицы 2) Группировка с помощью относительного недавно введенного оператора GROUP BY (в том числе GROUP BY without MEMBERS) 3) Группировка с помощью операторов AT ENDAT. Давайте рассмотрим на примере вычисления максимального значения (поле BUDAT) из внутренней таблицы эти способы. Пусть у нас имеется таблица (полный код доступен по ссылке) Группировка с помощью сортированной таблицы выполняется просто: создаётся сортированная таблица с уникальным ключом, равным ключам группировки. А затем выполняется нужная агрегированная функция. Однако в нашем примере нам ну
Оглавление

При обработке данных иногда требуется сгруппировать данные и посчитать какое-либо агрегированное значение (MAX, MIN, AVG, SUM, COUNT и другие). Традиционно, такие функции реализуются в SQL; однако и на сервере приложений приходится выполнять такие вычисления. В ABAP имеется 3 стандартных способа (встроенных) для группировки с последующим вычислением агрегированных значений, а именно:

1) Группировка с помощью ключей сортированной таблицы

2) Группировка с помощью относительного недавно введенного оператора GROUP BY (в том числе GROUP BY without MEMBERS)

3) Группировка с помощью операторов AT ENDAT.

Давайте рассмотрим на примере вычисления максимального значения (поле BUDAT) из внутренней таблицы эти способы.

Пусть у нас имеется таблица (полный код доступен по ссылке)

Рис. 1 Начальное заполнение внутренней таблицы
Рис. 1 Начальное заполнение внутренней таблицы

Сортированная таблица (SORTED TABLE)

Группировка с помощью сортированной таблицы выполняется просто: создаётся сортированная таблица с уникальным ключом, равным ключам группировки. А затем выполняется нужная агрегированная функция. Однако в нашем примере нам нужно найти максимальное значение поля BUDAT для каждой полученной группы, и мы можем заранее подготовить данные так, что максимальное значение уже будет подготовленно: а именно предварительно отсортировать данные, сделав первую запись с наибольшей датой.

Рис. 2 Группировка с максимальной датой с помощью сортировки
Рис. 2 Группировка с максимальной датой с помощью сортировки

Результат будет таким

Рис. 3 Результат группировки
Рис. 3 Результат группировки

Этот способ является лаконичным, наглядным и надежным: ключи задаются явно, контролируются компилятором, и сортированные таблицы уже существуют много десятилетий (то есть достаточно оптимизированным). (полный код доступен по ссылке).

Группировка с помощью GROUP BY

GROUP BY – относительно новый (и долгожданный 😊 ) оператор в ABAP. Справка к нему доступна. Даёт разные возможности по группировки данных. Принцип работы: «внутри» создаётся объект «группа» и затем с помощью этого объекта можно обрабатывать группу и каждую запись внутри группы. При этом можно передавать как полную строку, так и только ключи (для целей производительности). Давайте рассмотрим пример. (полный код доступен по ссылке). (!!!) Объект группы нельзя передавать в качестве параметра другим code-unit и зачастую это «портит картину»; особенно когда нужно использовать несколько функций для агрегированного значения; а также нельзя менять порядок строк и ключи в исходной таблице.

Рис. 4 Группировка с помощью GROUP BY и поиск значения по агрегированной функции (в нашем случае – максимальное значение)
Рис. 4 Группировка с помощью GROUP BY и поиск значения по агрегированной функции (в нашем случае – максимальное значение)

А вот более производительный GROUP BY с дополнением WITHOUT MEMBERS.

Рис. 5 GROUP BY without MEMBERS
Рис. 5 GROUP BY without MEMBERS

Группировка с помощью AT … ENDAT.

Этот оператор (точнее набор операторов) используется уже с давних пор. Справка доступна по ссылке. Особенность операторов в том, что группировка происходит не только по указанному полю, а по всем полям в структуре до указанного поля. Иногда может сложиться впечатление, что оператор работает неправильно, но всё правильно 😊 В справке этот момент указан.

Рис. 6 Справка подчеркивает, что новая группа начинается, когда меняется компонент или значение слева от компонента
Рис. 6 Справка подчеркивает, что новая группа начинается, когда меняется компонент или значение слева от компонента

Пример «ожидаемого» и «неожиданного» результата доступным по ссылке на github.

Рис. 7 Пример группировки с помощью AT NEW ... ENDAT
Рис. 7 Пример группировки с помощью AT NEW ... ENDAT

Мы рассмотрели 3 стандартных/встроенных способа группировки. (полный код доступен по ссылке). Также (если есть желание) можно прокомментировать решение на sap.blogs. а какой способ Вам нра?

Однако, есть еще и 4й (+1 способ). О нём будет рассказано отдельно.