ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Externe Daten verarbeiten →  ABAP-Datenbankzugriffe →  Open SQL →  Open SQL - Lesende Zugriffe →  SELECT → 

SELECT - GROUP BY

Kurzreferenz

Syntax

... GROUP BY { { col1, col2, ...
                 sql_exp1, sql_exp2 ... }
             | (column_syntax) } ...


Zusätze:

1. ... col1, col2, ...

2. ... sql_exp1, sql_exp2, ...

3. ... (column_syntax)

Wirkung

Der Zusatz GROUP BY fasst Gruppen von Zeilen, die in den Spalten col1, col2, ... den gleichen Inhalt bzw. in den SQL-Ausdrücken sql_exp1, sql_exp2, ... das gleiche Ergebnis haben, in der Ergebnismenge zu einer Zeile zusammen. Die Angabe kann entweder statisch als kommaseparierte Liste col1, col2 ..., sql_exp1, sql_exp2, ... oder dynamisch als eingeklammertes Datenobjekt column_syntax angegeben werden. Die Reihenfolge der Spalten oder SQL-Ausdrücke in der kommaseparierten Liste ist beliebig.

Die Verwendung von GROUP BY setzt voraus, dass in der SELECT-Liste nur einzelne Elemente, nicht jedoch alle Spalten über * angegeben sind. Wenn GROUP BY verwendet wird, müssen dort alle Spalten aufgeführt werden, die hinter SELECT direkt oder als Argument eines SQL-Ausdrucks und nicht als Argument einer Aggregatfunktion angegeben sind. Spalten, die nicht hinter GROUP BY aufgeführt sind, können hinter SELECT also nur als Argument einer Aggregatfunktion aufgeführt werden. Die Aggregatfunktionen legen fest, wie der Inhalt dieser Spalten in der zusammengefassten Zeile aus den Inhalten aller Zeilen einer Gruppe bestimmt wird.

Bei Pool- und Cluster-Tabellen kann der Zusatz GROUP BY nicht angegeben werden. Die hinter GROUP BY angegebenen Spalten dürfen nicht vom Typ STRING, RAWSTRING, LCHR oder LRAW sein.

Hinweise

Zusatz 1

... col1, col2, ...

Wirkung

Direkte Angabe einzelner Spalten col1, col2, ..., nach deren Inhalt gruppiert wird. Es müssen die gleichen Spaltenbezeichner wie in der SELECT-Liste angegeben werden. Die Angabe alternativer Spaltennamen ist nicht möglich.

Hinweise

Beispiel

Die Zeilen der Datenbanktabelle SFLIGHT, die in der Spalte CARRID den gleichen Inhalt haben, werden zusammengefasst. Die kleinsten und größten Werte der Spalte PRICE werden für jede dieser Gruppen bestimmt und in die zusammengefasste Zeile gestellt.

DATA:
  BEGIN OF wa,
    carrid  TYPE sflight-carrid,
    minimum TYPE p DECIMALS 2,
    maximum TYPE p DECIMALS 2,
  END OF wa.

SELECT carrid, MIN( price ), MAX( price )
       FROM sflight
       GROUP BY carrid
       INTO (@wa-carrid, @wa-minimum, @wa-maximum).
  cl_demo_output=>write_data( wa ).
ENDSELECT.
cl_demo_output=>display( ).

Beispiel

Nach Eingabe einer beliebigen Spalte der Datenbanktabelle SPFLI werden die selektierten Daten nach dieser Spalte gruppiert, d.h. dass gleiche Einträge zusammengefasst werden. In count wird die Anzahl der Flugverbindungen für die unterschiedlichen Werte in der Spalte spflicol bestimmt. Gibt man z.B. "CITYFROM" als spflicol ein, so wird in count die Anzahl der Ziele für jeden Abflugort bestimmt. In TRY-Kontrollstrukturen werden verschiedene mögliche Ausnahmen behandelt. Insbesondere wird die Benutzereingabe mit einer Methode der Klasse CL_ABAP_DYN_PRG auf ihre Gültigkeit überprüft.

PARAMETERS spflicol TYPE c LENGTH 20.

DATA: dref      TYPE REF TO data,
      long_name TYPE string,
      count     TYPE i,
      fieldlist TYPE string.

FIELD-SYMBOLS <fs> TYPE any.

AT SELECTION-SCREEN.
  TRY.
      cl_abap_dyn_prg=>check_column_name( spflicol ).
    CATCH cx_abap_invalid_name.
      MESSAGE 'Not allowed' TYPE 'E'.
  ENDTRY.

START-OF-SELECTION.
  TRY.
      long_name = 'spfli-' && spflicol.
      CREATE DATA dref TYPE (long_name).
      ASSIGN dref->* TO <fs>.
    CATCH cx_sy_create_data_error.
      MESSAGE 'Not allowed' TYPE 'E'.
  ENDTRY.

  fieldlist = spflicol && ', count(*)'.

  TRY.
      SELECT DISTINCT (fieldlist)
             FROM spfli
             GROUP BY (spflicol)
             INTO (@<fs>, @count).
        cl_demo_output=>write( |{ <fs> } {
                                  count }| ).
      ENDSELECT.
      cl_demo_output=>display( ).
    CATCH cx_sy_dynamic_osql_error.
      MESSAGE 'Not allowed' TYPE 'E'.
  ENDTRY.

Zusatz 2

... sql_exp1, sql_exp2, ...

Wirkung

Angabe von SQL-Ausdrücken, nach deren Ergebnis gruppiert wird. Jeder hinter GROUP BY angegebene SQL-Ausdruck muss in genau der gleichen Schreibweise auch an einer beliebigen Stelle der SELECT-Liste aufgeführt sein.

Die Verwendung einer Spalte als Operand eines SQL-Ausdrucks hinter GROUP BY wirkt bezüglich des Zusammenspiels mit der SELECT-Liste wie ihre einzelne Angabe. Eine Spalte, die in der SELECT-Liste kein Argument einer Aggregatfunktion ist, kann hinter GROUP BY einzeln oder als Operand eines SQL-Ausdrucks aufgeführt sein. Wenn eine solche Spalte als Operand eines SQL-Ausdrucks aufgeführt ist, muss sie nicht einzeln aufgeführt sein.

Hinter GROUP BY können alle in der SELECT-Liste möglichen SQL-Ausdrücke angegeben werden, mit folgenden Einschränkungen:

Hinweise

Beispiel

Siehe SQL-Ausdrücke, Verwendung mit GROUP BY.

Zusatz 3

... (column_syntax)

Wirkung

Alternativ zur statischen Angabe kann ein eingeklammertes Datenobjekt column_syntax angegeben werden, das bei Ausführung der Anweisung die Syntax der Liste von Spalten oder SQL-Ausdrücken ausgenommen Hostausdrücke enthält oder initial ist. Für column_syntax gilt das Gleiche wie bei der dynamischen Spaltenangabe als SELECT-Liste.

Ist der Inhalt von column_syntax initial, werden entweder alle oder keine Zeilen zusammengefasst. Die Spalten hinter SELECT müssen dann entweder ausschließlich als Argumente von Aggregatfunktionen oder ausschließlich direkt bzw. als Argumente von SQL-Ausdrücken aufgeführt sein, andernfalls kommt es zur behandelbaren Ausnahme CX_SY_OPEN_SQL_DB.

Sicherheitshinweis

Dynamische Programmiertechniken können falls falsch verwendet ein ernsthaftes Sicherheitsrisiko darstellen. Dynamische Inhalte, die von außen in ein Programm übernommen werden, müssen vor ihrer Verwendung in dynamischen Anweisungen gründlich überprüft oder maskiert werden. Hierfür dienen unter anderem die Systemklasse CL_ABAP_DYN_PRG oder die eingebaute Funktion escape. Siehe SQL-Injections über dynamische Tokens.

Hinweise

Kommentarzeichen, die innerhalb von Literalen stehen sind aber Teil des Literals.