Modere ABAP Group By Techniken
Die Gruppierung von internen Tabellen war in klassischen ABAP-Versionen immer ein Problem. Oft musste man aufwendige LOOPs und aggregierende Hilfstabellen verwenden.Mit der Einführung von ABAP 7.40 und neueren Sprachfeatures hat sich das geändert. Die GROUP BY-Klausel ermöglicht eine einfache und effiziente Gruppierung von Daten direkt innerhalb einer SELECT-Anweisung oder mit modernen iterativen Methoden. In diesem Beitrag zeigen wir anhand der bekannten SFLIGHT-Tabellen, wie sich diese Techniken optimal nutzen lassen und vergleichen sie mit älteren Methoden.
Klassische Gruppierung in älteren ABAP-Versionen
Vor ABAP 7.40 war die Gruppierung von Daten oft mit einem hohen Aufwand verbunden. Eine typische Methode bestand darin, die interne Tabelle mit einem LOOP durchzugehen und die Werte manuell in eine aggregierte Tabelle zu übertragen:
DATA: lt_sflight TYPE TABLE OF sflight,
lt_agg TYPE TABLE OF sflight,
ls_sflight TYPE sflight,
ls_agg TYPE sflight.
SELECT * FROM sflight INTO TABLE lt_sflight WHERE carrid = 'LH'.
LOOP AT lt_sflight INTO ls_sflight.
READ TABLE lt_agg INTO ls_agg WITH KEY carrid = ls_sflight-carrid.
IF sy-subrc <> 0.
ls_agg-carrid = ls_sflight-carrid.
ls_agg-price = ls_sflight-price.
APPEND ls_agg TO lt_agg.
ELSE.
ls_agg-price = ls_agg-price + ls_sflight-price.
MODIFY lt_agg FROM ls_agg.
ENDIF.
ENDLOOP.
Dieses Verfahren ist nicht nur umständlich, sondern auch ineffizient, da für jede Zeile ein zusätzlicher Tabellenzugriff notwendig ist.
Moderne Gruppierung mit GROUP BY
Mit ABAP 7.40 wurde die GROUP BY-Klausel für interne Tabellen eingeführt. Dadurch kann die Aggregation direkt in einer SELECT-Anweisung durchgeführt werden. Im Folgenden erläutern wir ausführlich, wie diese Technik angewendet wird, und fügen weitere Beispiele mit unterschiedlichen Aggregationsarten wie COUNT, MAX und MIN hinzu, um verschiedene Anwendungsfälle abzudecken:
DATA: lt_agg TYPE TABLE OF sflight.
SELECT carrid, SUM( price ) AS total_price
FROM sflight
WHERE carrid = 'LH'
GROUP BY carrid
INTO TABLE lt_agg.
Diese Methode ist nicht nur einfacher zu schreiben, sondern auch performanter, da die Aggregation direkt in der Datenbank geschieht.
Interne Gruppierung mit GROUP BY in LOOPs
Zusätzlich zur SQL-Gruppierung ermöglicht ABAP 7.40 auch die Gruppierung innerhalb von LOOP AT GROUP-Strukturen. Diese Methode bietet zahlreiche Vorteile, wie eine saubere Strukturierung und weniger Code-Wiederholungen. Im Folgenden finden Sie mehrere Beispiele mit unterschiedlichen Gruppierungskriterien, wie die Gruppierung nach Airline und Flugnummer, sowie Gruppierungen mit verschiedenen Aggregationen wie SUM, COUNT und AVG. Außerdem zeigen wir, wie Sie innerhalb der LOOP-Gruppen bedingte Logik einfügen oder zusätzliche Transformationen durchführen können. Ein Beispiel zur Gruppierung innerhalb einer internen Tabelle:
DATA: lt_sflight TYPE TABLE OF sflight.
SELECT * FROM sflight INTO TABLE lt_sflight WHERE carrid = 'LH'.
LOOP AT lt_sflight INTO DATA(ls_sflight) GROUP BY ls_sflight-carrid INTO DATA(group).
WRITE: / 'Fluggesellschaft:', group.
LOOP AT GROUP group INTO ls_sflight.
WRITE: / ls_sflight-connid, ls_sflight-price.
ENDLOOP.
ENDLOOP.
Hier wird die Tabelle direkt im LOOP gruppiert, was für bestimmte Szenarien eine performante und übersichtliche Lösung darstellt.
Erweiterte Gruppierung nach mehreren Kriterien
ABAP erlaubt auch die Gruppierung nach mehreren Spalten, was besonders nützlich ist, wenn eine detailliertere Analyse der Daten erforderlich ist. Zusätzlich lassen sich komplexe Hierarchien abbilden, indem man Gruppierungen über mehrere Ebenen hinweg erstellt. Hierbei kann jede Gruppe weitere Untergruppen enthalten, was z.B. für Berichte und multidimensionale Analysen ideal ist. Auch können Filter und Bedingungen innerhalb der Gruppierungen verwendet werden, um flexible und leistungsfähige Abfragen zu erstellen. Im Folgenden werden Beispiele für solche komplexen Gruppierungen gezeigt, die tiefergehende Analysen ermöglichen.
DATA: lt_agg TYPE TABLE OF sflight.
SELECT carrid, connid, SUM( price ) AS total_price
FROM sflight
WHERE carrid = 'LH'
GROUP BY carrid, connid
INTO TABLE lt_agg.
Diese Methode ermöglicht es, die Gesamtkosten nicht nur pro Fluggesellschaft, sondern auch pro Flugroute zu berechnen.
Gruppierung mit Aggregationen für Durchschnittswerte
Neben der Summierung kann GROUP BY auch für andere Aggregatfunktionen wie Durchschnittswerte, Zählungen mit COUNT, Maximalwerte mit MAX und Minimalwerte mit MIN genutzt werden. Darüber hinaus lassen sich komplexere Berechnungen wie gewichtete Mittelwerte oder bedingte Aggregationen mithilfe von CASE WHEN-Klauseln und zusätzlichen Berechnungen erstellen. Dies bietet eine breite Palette an Analysemöglichkeiten direkt in ABAP und vermeidet komplexen Nachbearbeitungs-Code. Im Folgenden zeigen wir Beispiele für jede dieser Aggregationsarten:
DATA: lt_avg TYPE TABLE OF sflight.
SELECT carrid, AVG( price ) AS avg_price
FROM sflight
WHERE carrid = 'LH'
GROUP BY carrid
INTO TABLE lt_avg.
Dies ist nützlich, wenn beispielsweise Durchschnittspreise pro Fluggesellschaft analysiert werden sollen.
Gruppierung mit interner Sortierung
Falls eine weitere Sortierung innerhalb der Gruppen erforderlich ist, kann dies mit der Kombination von GROUP BY und ORDER BY erfolgen. Zusätzlich können mehrere Sortierungsebenen verwendet werden, um feingranulare Reihenfolgen zu definieren. Beispiele zeigen, wie man innerhalb von Gruppen sortiert und gleichzeitig Aggregationen anwendet. Mehr Text folgt mit detaillierten Erklärungen und Code-Beispielen:
DATA: lt_sorted TYPE TABLE OF sflight.
SELECT carrid, connid, price
FROM sflight
WHERE carrid = 'LH'
ORDER BY carrid, connid DESC
INTO TABLE lt_sorted.
Diese Methode ist besonders hilfreich für Berichte, bei denen die höchsten oder niedrigsten Preise innerhalb einer Gruppe relevant sind.
Fazit: Moderne ABAP-Techniken für effizientere Gruppierungen
Die modernen Gruppierungsfunktionen in ABAP machen es möglich: Aggregationen lassen sich damit deutlich einfacher und performanter umsetzen. Das gilt besonders bei großen Datenmengen. Hier bieten sich die neuen GROUP BY-Möglichkeiten sowohl auf Datenbankebene als auch innerhalb von LOOPs an.In diesem Beitrag habe ich gezeigt, wie vielfältig und flexibel die Gruppierung in ABAP gestaltet werden kann. Die Beispiele zeigen klar: Nicht nur klassische Summierungen sind möglich, sondern auch komplexere Aggregationen, bedingte Berechnungen und mehrdimensionale Gruppierungen.Entwickler können also ihre ABAP-Programme optimieren, die Performance steigern und den Code besser lesbar machen. CloudDNA unterstreicht mit ihrer Expertise im Bereich ABAP-Optimierung, dass moderne SAP-Entwicklung von tiefgehendem Wissen und praxisnaher Erfahrung profitiert.
Warum CloudDNA?
Die Experten der CloudDNA GmbH verfügen über umfassendes Wissen rund um ABAP-Optimierung, moderne SAP-Entwicklung und innovative Erweiterungen. Mit mehr als 15 veröffentlichten SAP Press-Büchern, einem erfolgreichen Blog und einem spezialisierten YouTube-Kanal teilen wir praxisnahe Einblicke und technisches Know-how. Wir unterstützen Unternehmen dabei, effiziente und skalierbare SAP-Lösungen zu entwickeln – sei es für On-Premise oder Cloud-Umgebungen – und bieten dabei fundierte Beratung und bewährte Best Practices.
Für weitere Informationen zu SAP-Entwicklung und ABAP-Optimierung besuchen Sie unseren Blog oder nehmen Sie direkt Kontakt mit uns auf!