GROUP BY en SQL Oracle : Guide Complet et Exemples

Maîtrisez la clause GROUP BY en SQL Oracle : définition, syntaxe, exemples pratiques et erreurs courantes. Regroupez vos données efficacement.

Illustration du tutoriel SQL Oracle : GROUP BY en SQL Oracle : Guide Complet et Exemples

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.

Publicité

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 le SELECT qui ne sont pas des fonctions d’agrégation doivent obligatoirement figurer dans le GROUP BY.
  • fonction_agregation(colonne3) : les fonctions d’agrégation Oracle les plus utilisées sont COUNT(), SUM(), AVG(), MIN() et MAX().
  • 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

Publicité

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 CA

Ré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 expression

Solution : 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émentRôleRemarque Oracle
GROUP BY colRegroupe les lignes par valeur unique de colonneObligatoire si agrégats dans le SELECT
WHEREFiltre avant le regroupementInterdit avec les fonctions d’agrégation
HAVINGFiltre après le regroupementAccepte les fonctions d’agrégation
COUNT()Compte les lignes d’un groupeCOUNT(*) inclut les NULL
SUM()Additionne les valeurs d’un groupeIgnore automatiquement les NULL
AVG()Calcule la moyenne d’un groupeIgnore automatiquement les NULL
ORA-00979Colonne absente du GROUP BYAjouter la colonne ou l’agréger

2 bonnes pratiques Oracle

  1. Utilisez HAVING à bon escient : ne filtrez jamais via HAVING ce qui peut l’être via WHERE. Filtrer avant le regroupement avec WHERE réduit le volume de données traité par Oracle et améliore significativement les performances, surtout sur les grandes tables.
  2. Indexez les colonnes de regroupement : sur Oracle, la présence d’un index sur les colonnes utilisées dans GROUP BY permet 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 :

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité