SAP NetWeaver AS ABAP Release 750, ©Copyright 2016 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation →
ABAP - Referenz →
Externe Daten verarbeiten →
ABAP-Datenbankzugriffe →
Open SQL →
Open SQL - Lesende Zugriffe →
SELECT →
SELECT - HAVING
Kurzreferenz
Syntax
... HAVING sql_cond ...
Wirkung
Der Zusatz HAVING schränkt die Anzahl von zu Gruppen zusammengefassten
Zeilen in der Ergebnismenge durch einen logischen Ausdruck sql_cond für
diese Zeilen ein. Die Syntax des logischen Ausdrucks sql_cond entspricht
der Syntax des logischen Ausdrucks sql_cond
der WHERE-Bedingung. Der logische Ausdrucks wertet die Inhalte von Zeilengruppen aus.
Die Operanden der relationalen Ausdrücke des logischen Ausdrucks können sein:
-
Hostvariablen und
-
Hostausdrücke auf den rechten Seiten von Vergleichen.
-
Spalten der hinter FROM aufgeführten
Datenquellen auf beiden Seiten der Vergleiche.
Diese Spalten müssen nicht als solche in der
SELECT-Liste aber hinter dem Zusatz GROUP
BY aufgeführt sein. Es wird für jede Gruppe der Wert ausgewertet, nach dem gruppiert wird.
-
SQL-Ausdrücke auf den linken Seiten von Vergleichen.
Es muss entweder der gleiche Ausdruck oder es müssen alle Spalten des Ausdrucks einzeln hinter GROUP BY aufgeführt sein.
-
Beliebige Aggregatausdrücke auf beiden Seiten der Vergleiche. Als Argumente der Aggregatfunktionen können beliebige Spalten und mit diesen gebildete
SQL-Ausdrücke angegeben werden. Diese Spalten müssen
nicht hinter GROUP BY aufgeführt werden. Ein solcher Aggregatausdruck
wird für jede in GROUP BY definierte Zeilengruppe ausgewertet und
sein Ergebnis als Operand des Vergleichs verwendet. Für die SQL-Ausdrücke in den Aggregatfunktionen
gilt das Gleiche wie in der SELECT-Liste. Die Aggregatfunktionen der
SELECT-Liste und der HAVING-Klausel und die darin als Argumente angegebenen SQL-Ausdrücke können verschieden sein.
Wenn eine HAVING-Klausel angegeben ist, müssen alle Spalten der SELECT-Liste, die dort keine Argumente von
Aggregatfunktionen sind, hinter
GROUP BY aufgeführt
sein. Wenn die SELECT-Liste als * angegeben ist, kann es keine HAVING-Klausel ohne
GROUP BY-Klausel geben. Bei
Pool- und
Cluster-Tabellen kann der Zusatz HAVING nicht angegeben werden.
Hinweise
-
Wenn für Spalten, die hinter HAVING außerhalb von Aggregatfunktionen
angegeben sind, keine Gruppierung mit GROUP BY erfolgt, kommt es in den
strikten Modi der Syntaxprüfung ab Release
7.40, SP08 zu einem Syntaxfehler. Außerhalb dieser strikten Modi kommt es zu einer Warnung von
der Syntaxprüfung und zu einer nicht abfangbaren Ausnahme. Das Gleiche gilt für Spalten,
die bei Angabe einer HAVING-Klausel direkt in der
SELECT-Liste, aber nicht hinter GROUP BY aufgeführt sind.
-
Wenn die SELECT-Liste als
* angegeben ist, und eine HAVING-Klausel ohne GROUP BY-Klausel verwendet wird, kommt es im
strikten Modus ab Release 7.50 zu einem Syntaxfehler.
-
Wenn auf der linken Seite der HAVING-Bedingung ein SQL-Ausdruck oder auf der rechten Seite ein Hostausdruck vorkommt, wird die Syntaxprüfung im
strikten Modus ab Release 7.50 ausgeführt, welche die Anweisung strenger behandelt als die normale Syntaxprüfung.
-
Spalten, die hinter HAVING als Argumente von Aggregatfunktionen aufgeführt sind, dürfen auch hinter GROUP BY aufgeführt sein.
-
Wenn der Zusatz GROUP BY nicht angegeben ist oder das Datenobjekt column_syntax
bei der dynamischen Spaltenangabe hinter GROUP BY initial ist, kann der Zusatz
HAVING nur dann angegeben werden, wenn die gesamte Ergebnismenge in eine
Zeile gruppiert ist, d.h., wenn hinter SELECT ausschließlich Aggregatausdrücke
stehen. In diesem Fall können in sql_cond ausschließlich Aggregatausdrücke als Operanden angegeben werden, die für alle Zeilen der Ergebnismenge ausgewertet werden.
Beispiel
Auslesen der Anzahl gebuchter Raucher- bzw. Nichtraucherplätze pro Flugdatum einer Verbindung.
PARAMETERS: p_carrid TYPE sbook-carrid,
p_connid TYPE sbook-connid.
TYPES: BEGIN OF sbook_type,
fldate TYPE sbook-fldate,
smoker TYPE sbook-smoker,
smk_cnt TYPE i,
END OF sbook_type.
DATA sbook_tab TYPE TABLE OF sbook_type.
SELECT fldate, smoker, COUNT( * ) AS smk_cnt
FROM sbook
WHERE connid = @p_connid
GROUP BY carrid, fldate, smoker
HAVING carrid = @p_carrid
ORDER BY fldate, smoker
INTO CORRESPONDING FIELDS OF TABLE @sbook_tab.
Beispiel
Siehe SQL-Ausdrücke, Verwendung in Aggregatausdrücken.