
GROUP BY en SQL Oracle : Guide Complet avec Exemples Pratiques
La clause GROUP BY en SQL Oracle est l’un des outils les plus puissants pour analyser et synthétiser des données. Elle permet de regrouper des lignes partageant des valeurs communes afin d’y appliquer des fonctions d’agrégation comme SUM, COUNT ou AVG. Maîtriser le GROUP BY Oracle est indispensable pour tout développeur ou analyste travaillant avec des bases de données relationnelles en entreprise.
Définition et utilisation de GROUP BY
La clause GROUP BY est une instruction SQL qui regroupe plusieurs lignes d’une table en sous-ensembles distincts, selon une ou plusieurs colonnes. Une fois les lignes regroupées, il devient possible d’appliquer des fonctions d’agrégation sur chaque groupe pour obtenir des indicateurs synthétiques.
Cas d’usage en entreprise
Dans un contexte professionnel, GROUP BY répond à des besoins analytiques concrets et récurrents :
- Comptabilité / Finance : calculer le chiffre d’affaires total par département, par région ou par période.
- Ressources humaines : obtenir le salaire moyen par catégorie de poste ou par service.
- Commerce : connaître le nombre de commandes passées par chaque client sur une période donnée.
- Logistique : agréger les quantités de stock par entrepôt ou par fournisseur.
Sans GROUP BY, ces analyses nécessiteraient des traitements applicatifs complexes et peu performants. Oracle optimise nativement l’exécution de cette clause grâce à son moteur SQL.
Syntaxe complète de GROUP BY en Oracle
Voici la syntaxe standard de la clause GROUP BY telle qu’elle s’utilise dans Oracle Database :
SELECT colonne1, colonne2, fonction_agregation(colonne3)
FROM nom_table
[WHERE condition_filtre]
GROUP BY colonne1, colonne2
[HAVING condition_sur_agregat]
[ORDER BY colonne1];Explication des paramètres essentiels
SELECT colonne1, colonne2: toutes les colonnes présentes dans leSELECTqui ne sont pas des fonctions d’agrégation doivent obligatoirement figurer dans leGROUP BY.fonction_agregation(colonne3): les fonctions d’agrégation Oracle les plus utilisées sontCOUNT(),SUM(),AVG(),MIN()etMAX().WHERE: filtre les lignes avant le regroupement. Il ne peut pas contenir de fonction d’agrégation.HAVING: filtre les groupes après le regroupement. Il peut contenir des fonctions d’agrégation.ORDER BY: trie le résultat final, compatible avec les colonnes groupées ou les agrégats.
Ordre d’exécution logique dans Oracle : FROM ? WHERE ? GROUP BY ? HAVING ? SELECT ? ORDER BY
Exemples pratiques de GROUP BY en SQL Oracle
Exemple 1 – Chiffre d’affaires total par département
Contexte métier : Une entreprise souhaite connaître le montant total des ventes générées par chacun de ses départements commerciaux, en ne retenant que les départements ayant dépassé 50 000 € de chiffre d’affaires.
-- Calcul du chiffre d'affaires total par département
-- On filtre les départements dont le total dépasse 50 000
SELECT
d.nom_departement,
SUM(v.montant_vente) AS chiffre_affaires_total,
COUNT(v.id_vente) AS nombre_ventes
FROM
ventes v
JOIN departements d ON v.id_departement = d.id_departement
WHERE
v.statut_vente = 'VALIDEE' -- On ne retient que les ventes validées
GROUP BY
d.nom_departement
HAVING
SUM(v.montant_vente) > 50000 -- Filtre appliqué après agrégation
ORDER BY
chiffre_affaires_total DESC; -- Du plus grand au plus petit CARésultat attendu : une ligne par département avec le total des ventes validées et le nombre de transactions associées, trié du chiffre d’affaires le plus élevé au plus faible.
Exemple 2 – Nombre d’employés et salaire moyen par poste
Contexte métier : Le service RH souhaite éditer un rapport mensuel présentant, pour chaque intitulé de poste, le nombre d’employés actifs et leur salaire moyen, uniquement pour les postes comportant au moins 3 salariés.
-- Rapport RH : effectif et salaire moyen par poste
-- Basé sur la table EMPLOYEES du schéma HR d'Oracle (schéma de démonstration standard)
SELECT
e.job_id AS code_poste,
j.job_title AS intitule_poste,
COUNT(e.employee_id) AS nb_employes,
ROUND(AVG(e.salary), 2) AS salaire_moyen,
MIN(e.salary) AS salaire_minimum,
MAX(e.salary) AS salaire_maximum
FROM
employees e
JOIN jobs j ON e.job_id = j.job_id
WHERE
e.hire_date <= SYSDATE -- Tous les employés déjà recrutés
GROUP BY
e.job_id,
j.job_title -- Les deux colonnes du SELECT doivent être groupées
HAVING
COUNT(e.employee_id) >= 3 -- Postes avec au moins 3 employés
ORDER BY
nb_employes DESC,
salaire_moyen DESC;Note Oracle : Cet exemple utilise le schéma HR fourni par défaut avec Oracle Database, ce qui le rend directement testable dans SQL Developer ou SQLcl.
Erreurs courantes avec GROUP BY en Oracle
Erreur ORA-00979 : not a GROUP BY expression
Il s’agit de l’erreur la plus fréquente rencontrée par les développeurs qui débutent avec GROUP BY. Elle survient lorsqu’une colonne est présente dans le SELECT sans figurer dans la clause GROUP BY ni être encapsulée dans une fonction d’agrégation.
Exemple d’erreur :
-- INCORRECT : first_name n'est pas dans le GROUP BY ni agrégé
SELECT department_id, first_name, COUNT(employee_id)
FROM employees
GROUP BY department_id;
-- Oracle retourne : ORA-00979: not a GROUP BY expressionSolution : ajouter la colonne manquante au GROUP BY, ou la retirer du SELECT, ou l’encapsuler dans une fonction d’agrégation comme MAX(first_name) si la valeur exacte n’est pas critique.
-- CORRECT : first_name ajouté dans le GROUP BY
SELECT department_id, first_name, COUNT(employee_id)
FROM employees
GROUP BY department_id, first_name;
-- OU : utilisation d'une agrégation pour first_name
SELECT department_id, MAX(first_name) AS exemple_prenom, COUNT(employee_id)
FROM employees
GROUP BY department_id;Règle d’or à retenir : dans une requête avec GROUP BY, chaque colonne du SELECT doit soit apparaître dans le GROUP BY, soit être entourée d’une fonction d’agrégation. Sans exception.
Résumé
| Élément | Rôle | Remarque Oracle |
|---|---|---|
GROUP BY col | Regroupe les lignes par valeur unique de colonne | Obligatoire si agrégats dans le SELECT |
WHERE | Filtre avant le regroupement | Interdit avec les fonctions d’agrégation |
HAVING | Filtre après le regroupement | Accepte les fonctions d’agrégation |
COUNT() | Compte les lignes d’un groupe | COUNT(*) inclut les NULL |
SUM() | Additionne les valeurs d’un groupe | Ignore automatiquement les NULL |
AVG() | Calcule la moyenne d’un groupe | Ignore automatiquement les NULL |
| ORA-00979 | Colonne absente du GROUP BY | Ajouter la colonne ou l’agréger |
2 bonnes pratiques Oracle
- Utilisez
HAVINGà bon escient : ne filtrez jamais viaHAVINGce qui peut l’être viaWHERE. Filtrer avant le regroupement avecWHEREréduit le volume de données traité par Oracle et améliore significativement les performances, surtout sur les grandes tables. - Indexez les colonnes de regroupement : sur Oracle, la présence d’un index sur les colonnes utilisées dans
GROUP BYpermet au moteur d’utiliser un index full scan plutôt qu’un tri complet de la table, ce qui peut diviser les temps de réponse par un facteur important sur des millions de lignes.
Aller plus loin
Pour approfondir votre maîtrise de l’agrégation et de l’analyse de données sous Oracle, voici trois sujets complémentaires que nous vous recommandons d’explorer :
- Les fonctions d’agrégation Oracle (SUM, COUNT, AVG, MIN, MAX) : maîtrisez toutes les fonctions utilisables avec
GROUP BYet découvrez leurs comportements face aux valeurs NULL. - La clause HAVING en SQL Oracle : apprenez à filtrer vos groupes efficacement et comprenez précisément la différence entre
WHEREetHAVING. - Les fonctions analytiques Oracle (OVER, PARTITION BY) : franchissez le niveau supérieur en découvrant comment effectuer des agrégations sans réduire le nombre de lignes retournées, grâce aux fonctions fenêtrées.
