Fonctions d'agrégation
Les fonctions d'agrégation opèrent sur une série de valeurs pour renvoyer une valeur scalaire. Vous pouvez utiliser ces fonctions dans les méthodes de sélection et de sous-requête.
Voici un exemple d'agrégation :
SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20
Cette agrégation calcule le total des salaires de la division 20.
Les fonctions d'agrégation sont AVG, COUNT, MAX, MIN et SUM. La syntaxe d'une fonction d'agrégation est illustrée dans l'exemple suivant :
aggregation-function ( [ ALL | DISTINCT ] expression )
ou :
COUNT( [ ALL | DISTINCT ] identification-variable )
ou :
COUNT( * )
L'option DISTINCT supprime les valeurs en double avant d'exécuter la fonction. ALL est l'option par défaut qui ne supprime pas les doublons. Les valeurs NULL sont ignorées lors du traitement de la fonction d'agrégation sauf COUNT(*) et COUNT(identification-variable) qui renvoient le total de tous les éléments que contient la série.
Si votre magasin de données est Informix, vous devez limiter l'argument d'expression à une expression de chemin d'accès à valeur unique lorsque vous utilisez la fonction COUNT ou les formes DISTINCT des fonctions SUM, AVG, MIN et MAX.
Définition du type de retour
Pour une méthode de sélection utilisant une fonction d'agrégation, vous pouvez définir le type de retour comme étant un type primitif ou un type d'encapsuleur. Le type de retour doit être compatible avec le type de retour du magasin de données. Les fonctions MAX et MIN peuvent s'appliquer à tout type de données numérique, chaîne ou de date et d'heure et renvoient le type de données correspondant. Les fonctions SUM et AVG acceptent un type numérique en entrée et renvoient le même type numérique que celui qui est utilisé dans le magasin de données. La fonction COUNT peut accepter n'importe quel type de données et renvoie un entier.
Lorsqu'elles s'appliquent à un ensemble vide, les fonctions SUM, AVG, MAX et MIN peuvent renvoyer une valeur null. La fonction COUNT renvoie zéro (0) lorsqu'elle est appliquée à un ensemble vide. Utilisez des types d'encapsuleur si la valeur de retour risque d'être null ; sinon, le conteneur affiche une exception ObjectNotFound.
Utilisation de GROUP BY et HAVING
La série de valeurs utilisée pour la fonction d'agrégation est déterminée par la collection résultant de la clause FROM et WHERE de la requête. Vous pouvez diviser la série en groupes et appliquer la fonction d'agrégation à chaque groupe. Pour exécuter cette action, utilisez une clause GROUP BY dans la requête. Cette clause définit les membres des groupes, ce qui comprend une liste d'expressions de chemin d'accès. Chaque expression de chemin d'accès désigne une zone d'un type primitif de byte, short, int, long, float, double, boolean ou char, ou d'un type d'encapsuleur de Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Boolean, Character, java.util.Calendar, java.util.Date, java.sql.Date, java.sql.Time ou java.sql.Timestamp.
L'exemple suivant illustre l'utilisation de la clause GROUP BY dans une requête qui calcule le salaire moyen pour chaque division :
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno
Lorsque vous divisez une série en groupes, une valeur NULL est considérée comme étant égale à une autre valeur NULL.
Tandis que la clause WHERE supprime par filtrage des nuplets (c'est-à-dire, des enregistrements des valeurs des collections renvoyées) de la clause FROM, les groupes peuvent être filtrés à l'aide d'une clause HAVING qui teste les propriétés des groupes faisant appel à des fonctions d'agrégation ou au regroupement des membres :
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(*) > 3 AND e.dept.deptno > 5
Cette requête renvoie le salaire moyen des divisions ayant plus de trois employés et dont le numéro de division est supérieur à cinq.
Il est possible d'utiliser une clause HAVING sans clause GROUP BY, auquel cas la totalité de la série est traitée comme un seul et même groupe auquel est appliquée la clause HAVING.