Aggregationsfunktionen
Aggregationsfunktionen verarbeiten eine Gruppe von Werten und geben einen einzigen skalaren Wert zurück. Diese Funktionen können Sie in den Methoden select und subselect verwenden.
Beispiel für eine Aggregation:
SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20
Bei dieser Aggregation wird die Summe der Gehälter für Abteilung (department) 20 berechnet.
Die Aggregationsfunktionen sind AVG, COUNT, MAX, MIN und SUM. Eine Aggregationsfunktion hat folgende Syntax:
Aggregationsfunktion ( [ ALL | DISTINCT ] Ausdruck )
oder:
COUNT( [ ALL | DISTINCT ] identification-variable )
oder:
COUNT( * )
Die Option DISTINCT eliminiert vor der Anwendung der Funktion doppelt vorkommende Werte. ALL ist die Standardeinstellung. dabei werden keine doppelt vorkommenden Werte eliminiert. Bei der Verarbeitung der Aggregationsfunktion werden Nullwerte ignoriert, außer für COUNT(*) und COUNT(identification-variable), die die Anzahl aller Elemente in der Gruppe zurückgeben.
Wenn Sie Informix als Datenspeicher verwenden, müssen Sie das Argument des Ausdrucks auf einen Pfadausdruck mit einem Wert beschränken, sofern Sie die Funktion COUNT oder die DISTINCT-Variante der Funktionen SUM, AVG, MIN und MAX verwenden.
Rückgabetyp definieren
Für eine Methode select mit einer Aggregationsfunktion können Sie den Rückgabetyp als Primitive-Typ oder Wrapper-Typ definieren. Der Rückgabetyp muss mit dem Rückgabetyp des Datenspeichers kompatibel sein. Die Funktionen MAX und MIN können auf jeden Datentyp numeric, string oder datetime angewendet werden und geben den entsprechenden Datentyp zurück. Die Eingabe für die Funktionen SUM und AVG muss vom Typ numeric sein. Diese Funktionen geben den im Datenspeicher verwendeten numeric-Typ zurück. Die Funktion COUNT kann mit beliebigen Datentypen verwendet werden und gibt ein Integer zurück.
Werden die Funktionen SUM, AVG, MAX und MIN auf eine leere Gruppe angewendet, geben Sie einen Nullwert zurück. Die Funktion COUNT gibt null (0) zurück, wenn sie auf eine leere Gruppe angewendet wird. Verwenden Sie Wrapper-Typen, wenn der Rückgabewert NULL zulässig ist. Andernfalls zeigt der Container eine ObjectNotFound-Ausnahme an.
GROUP BY und HAVING verwenden
Die für die Aggregationsfunktion verwendete Gruppe von Werten wird von der Objektgruppe bestimmt, die das Ergebnis der Abfrageklauseln FROM und WHERE ist. Sie können die Gruppe unterteilen und die Aggregationsfunktion auf jede Untergruppe anwenden. Verwenden Sie für diese Aktion in der Abfrage eine "GROUP BY"-Klausel. Die "GROUP BY"-Klausel definiert Gruppenmember, die eine Liste mit Pfadausdrücken umfassen. Jeder Pfadausdruck beschreibt ein Feld mit einem Primitive-Typ wie byte, short, int, long, float, double, boolean, char oder einen Wrapper-Typ wie Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Boolean, Character, java.util.Calendar, java.util.Date, java.sql.Date, java.sql.Time oder java.sql.Timestamp.
Das folgende Beispiel zeigt die Verwendung der "GROUP BY"-Klausel in einer Abfrage, die das Durchschnittsgehalt für jede Abteilung berechnet:
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno
Bei der Unterteilung einer Gruppe in Untergruppen werden Nullwerte als gleichwertig angesehen.
Wie die WHERE-Klausel Tupel (d. h. Datensätze mit den Werten der zurückgegebenen Objektgruppe) aus der Klausel FROM filtert, können die Gruppen wie mit einer HAVING-Klausel gefiltert werden, die Gruppeneigenschaften prüft, die sich auf Aggregationsfunktionen oder Gruppenmember auswirken:
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(*) > 3 AND e.dept.deptno > 5
Diese Abfrage gibt das Durchschnittsgehalt für Abteilungen zurück, die mehr als drei Mitarbeiter haben und deren Abteilungsnummer größer als fünf ist.
Es ist möglich, eine HAVING-Klausel ohne eine GROUP BY-Klausel zu verwenden, wodurch die gesamte Menge als eine einzige Gruppe betrachtet wird, auf die die HAVING-Klausel angewendet wird.