Pour l'analyse de données, DB2 Universal Database peut se baser sur certaines colonnes d'une table.
Il est possible de rassembler plusieurs lignes selon la structure de groupage définie par la clause GROUP BY. Dans sa forme la plus simple, un groupe est constitué de lignes, chacune ayant des valeurs identiques dans les colonnes "GROUP BY". Dans une clause SELECT, les noms des colonnes doivent correspondre à des colonnes de groupage ou à des fonctions de colonne. Ces dernières renvoient une valeur pour chaque groupe défini par la clause GROUP BY. Chaque groupe est représenté par une seule ligne dans l'ensemble des résultats. Dans l'exemple suivant, le résultat produit la liste des salaires les plus élevés par numéro de service :
SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT
Cette instruction donne le résultat suivant :
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
Notez que le salaire le plus élevé (MAX(SALARY)) est calculé par service (groupe défini par la clause GROUP BY), et non pour toute la société.
Une requête de groupage peut contenir une clause WHERE standard qui élimine les lignes ne répondant pas à un ou plusieurs critères avant de former les groupes et d'exécuter les fonctions de colonne. Il faut préciser la clause WHERE avant la clause GROUP BY. Par exemple :
SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM FROM EMPLOYEE WHERE HIREDATE > '1979-01-01' GROUP BY WORKDEPT, EDLEVEL ORDER BY WORKDEPT, EDLEVEL
Voici le résultat obtenu :
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
Tous les noms de colonne précisés dans l'instruction SELECT sont également mentionnés dans la clause GROUP BY. L'absence de ces noms de colonne dans les deux clauses entraîne une erreur. La clause GROUP BY renvoie une ligne par combinaison unique de WORKDEPT et EDLEVEL.
Il est possible d'appliquer aux groupes une condition qualifiante pour que DB2 ne renvoie que les résultats concernant les groupes qui respectent cette condition. Pour ce faire, incluez une clause HAVING après la clause GROUP BY. Une clause HAVING peut contenir un ou plusieurs prédicats, reliés par des AND et des OR. Chaque prédicat compare une propriété du groupe (comme AVG(SALARY)) à l'un des éléments suivants :
Par exemple :
HAVING AVG(SALARY) > 2 * MIN(SALARY)
Par exemple :
HAVING AVG(SALARY) > 20000
Par exemple, la requête suivante recherche le salaire le plus élevé et le salaire le moins élevé dans les services comprenant plus de 4 employés :
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM FROM EMPLOYEE GROUP BY WORKDEPT HAVING COUNT(*) > 4 ORDER BY WORKDEPT
Cette instruction donne le résultat suivant :
WORKDEPT MAXIMUM MINIMUM -------- ----------- ----------- D11 32250,00 18270,00 D21 36170,00 17250,00 E11 29750,00 15340,00
Dans une requête, il est possible mais rare d'avoir une clause HAVING sans clause GROUP BY. Dans ce cas, DB2 traite la table en entier en tant que groupe. Comme la table est considérée comme un seul groupe, le résultat ne donnera, au plus, qu'une ligne de résultat. Si une condition HAVING est vraie sur l'ensemble de la table, le résultat sélectionné est renvoyé (il ne se compose que de fonctions de colonne) ; sinon, aucune ligne n'est renvoyée.