DB2 Universal Database kann Daten basierend auf bestimmten Spalten einer Tabelle analysieren.
Sie können Zeilen gemäß einer Gruppierungsstruktur organisieren, die in einer Klausel GROUP BY definiert wird. In ihrer einfachsten Form besteht eine Gruppe aus einer Reihe von Zeilen mit identischen Werten in den Spalten, die in der Klausel GROUP BY angegeben sind. Die Spaltennamen in der Klausel SELECT müssen entweder Gruppierungsspalten oder Spaltenfunktionen angeben. Spaltenfunktionen geben einen Wert für jede Gruppe zurück, die in der Klausel GROUP BY definiert ist. Jede Gruppe wird in der Ergebnismenge durch eine Zeile dargestellt. Das folgende Beispiel erzeugt ein Ergebnis, das das höchste Gehalt für jede Abteilungsnummer auflistet:
SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT
Diese Anweisung erzeugt das folgende Ergebnis:
DEPT MAXIMUM ------ --------- 10 22959.20 15 20659.80 20 18357.50 38 18006.00 42 18352.80 51 21150.00 66 21000.00 84 19818.00
Bitte beachten Sie, daß MAX(SALARY) für jede Abteilung, eine durch die Klausel GROUP BY definierte Gruppe, und nicht für das gesamte Unternehmen berechnet wird.
Eine Gruppierungsabfrage kann eine Standardklausel WHERE enthalten, die Zeilen, welche das Qualifikationsmerkmal nicht erfüllen, eliminiert, bevor die Gruppen gebildet und die Spaltenfunktionen berechnet werden. Die Klausel WHERE muß vor der Klausel GROUP BY angegeben werden. Beispiel:
SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM FROM EMPLOYEE WHERE HIREDATE > '1979-01-01' GROUP BY WORKDEPT, EDLEVEL ORDER BY WORKDEPT, EDLEVEL
Das Ergebnis lautet:
WORKDEPT EDLEVEL MAXIMUM -------- ------- ----------- D11 17 18270.00 D21 15 27380.00 D21 16 36170.00 D21 17 28760.00 E11 12 15340.00 E21 14 26150.00
Bitte beachten Sie, daß jeder in der Anweisung SELECT angegebene Spaltenname auch in der Klausel GROUP BY enthalten ist. Werden die Spaltennamen nicht in beiden Positionen angegeben, erhalten Sie einen Fehler. Die Klausel GROUP BY gibt eine Zeile für jede eindeutige Kombination aus WORKDEPT und EDLEVEL zurück.
Sie können eine Qualifizierungsbedingung auf Gruppen anwenden. DB2 gibt dann nur für die Gruppen ein Ergebnis zurück, die die Bedingung erfüllen. Zu diesem Zweck fügen Sie nach der Klausel GROUP BY eine Klausel HAVING ein. Eine Klausel HAVING kann eines oder mehrere Prädikate enthalten, die durch die Operatoren AND und OR verbunden sind. Jedes Prädikat vergleicht ein Merkmal der Gruppe (wie z. B. AVG(SALARY)) mit einem der folgenden Elemente:
Beispiel:
HAVING AVG(SALARY) > 2 * MIN(SALARY)
Beispiel:
HAVING AVG(SALARY) > 20000
Beispielsweise sucht die folgende Abfrage nach dem höchsten und dem niedrigsten Gehalt in Abteilungen mit mehr als 4 Mitarbeitern:
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM FROM EMPLOYEE GROUP BY WORKDEPT HAVING COUNT(*) > 4 ORDER BY WORKDEPT
Diese Anweisung erzeugt das folgende Ergebnis:
WORKDEPT MAXIMUM MINIMUM -------- ----------- ----------- D11 32250.00 18270.00 D21 36170.00 17250.00 E11 29750.00 15340.00
Es ist möglich (wenngleich unüblich), daß eine Abfrage eine Klausel HAVING, aber keine Klausel GROUP BY enthält. In diesem Fall behandelt DB2 die gesamte Tabelle als eine Gruppe. Da die Tabelle als Gruppe behandelt wird, können Sie höchstens eine Ergebniszeile erhalten. Wenn die in der Klausel HAVING angegebene Bedingung für die Tabelle als ganzes wahr (= zutreffend) ist, wird das ausgewählte Ergebnis (das vollständig aus Spaltenfunktionen bestehen muß) zurückgegeben. Andernfalls werden keine Zeilen zurückgegeben.