Fonction SQL ORACLE – AVG()

Illustration du tutoriel SQL Oracle : Fonction SQL ORACLE – AVG()

La fonction SQL ORACLE AVG renvoie la moyenne de toutes les valeurs d’une colonne. AVG ne peut être utilisé qu’avec des champs numériques

Publicité
SELECT AVG(SAL) FROM EMP ;

AVG(SAL)
----------------------
2073,214285714285714285714285714285714286

🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.

Nous pouvons avoir le même résultat de AVG en utilisant SUM/COUNT

SELECT ROUND(SUM(SAL)/COUNT(SAL), 5), ROUND(AVG(SAL), 5) FROM EMP;

ROUND(SUM(SAL)/COUNT(SAL),5) ROUND(AVG(SAL),5) 
---------------------------- ---------------------- 
2073,21429                   2073,21429

Syntaxe complete de AVG

AVG( [ DISTINCT | ALL ] expression )
FormeCe qu’elle faitExemple
AVG(col)Moyenne de toutes les valeurs non nulles (defaut ALL)AVG(SAL)
AVG(DISTINCT col)Moyenne des valeurs distinctes uniquementAVG(DISTINCT SAL)
AVG(expression)Moyenne d’un calcul, pas seulement d’une colonneAVG(SAL * 12)

AVG n’accepte que du numerique. Sur une colonne texte ou date, Oracle leve ORA-00932: types de donnees incoherents.

Le piege des valeurs NULL

C’est l’erreur la plus courante sur les fonctions d’agregation Oracle : elles ignorent purement et simplement les lignes NULL. Elles ne les comptent pas comme des zeros. La difference se voit immediatement sur la table EMP, ou seuls 4 employes sur 14 ont une commission renseignee.

SELECT COUNT(*)        AS lignes,
       COUNT(COMM)     AS comm_non_nulles,
       SUM(COMM)       AS somme,
       AVG(COMM)       AS moyenne_oracle,
       SUM(COMM)/COUNT(*) AS moyenne_sur_14
  FROM EMP;

LIGNES COMM_NON_NULLES SOMME MOYENNE_ORACLE MOYENNE_SUR_14
------ --------------- ----- -------------- --------------
    14               4  2200            550     157,142857

Oracle divise par 4, pas par 14. Si vous vouliez traiter les commissions absentes comme des zeros, il faut le dire explicitement avec NVL :

SELECT AVG(NVL(COMM, 0)) FROM EMP;   -- 157,142857

Les deux resultats sont justes : ils repondent a deux questions differentes. « Quelle est la commission moyenne de ceux qui en touchent une ? » contre « Quelle est la commission moyenne de l’entreprise ? ». Choisissez en connaissance de cause.

Moyenne par groupe avec GROUP BY

Seule, AVG renvoie une ligne. Associee a GROUP BY, elle renvoie une moyenne par categorie — c’est son usage reel au quotidien.

SELECT DEPTNO,
       COUNT(*)          AS effectif,
       ROUND(AVG(SAL), 2) AS salaire_moyen
  FROM EMP
 GROUP BY DEPTNO
 ORDER BY salaire_moyen DESC;

DEPTNO EFFECTIF SALAIRE_MOYEN
------ -------- -------------
    10        3       2916,67
    20        5          2175
    30        6       1566,67

Regle a retenir : toute colonne du SELECT qui n’est pas dans une fonction d’agregation doit figurer dans le GROUP BY. Sinon, ORA-00979: n'est pas une expression GROUP BY.

Toujours arrondir une moyenne

Sans arrondi, Oracle affiche la precision maximale, ce qui est illisible :

SELECT AVG(SAL) FROM EMP;
-- 2073,214285714285714285714285714285714286

SELECT ROUND(AVG(SAL), 2) FROM EMP;
-- 2073,21

Prenez l’habitude d’encapsuler systematiquement : ROUND(AVG(...), 2). Pour un affichage formate avec separateur de milliers, combinez avec TO_CHAR : TO_CHAR(AVG(SAL), '999G999D99').

AVG en fonction analytique (sans perdre le detail)

Avec GROUP BY, vous perdez le detail des lignes. La version analytique OVER (PARTITION BY ...) garde chaque ligne et ajoute la moyenne de son groupe — ideal pour comparer un individu a sa moyenne.

SELECT ENAME, DEPTNO, SAL,
       ROUND(AVG(SAL) OVER (PARTITION BY DEPTNO), 2) AS moy_service,
       ROUND(SAL - AVG(SAL) OVER (PARTITION BY DEPTNO), 2) AS ecart
  FROM EMP
 ORDER BY DEPTNO, SAL DESC;

ENAME  DEPTNO  SAL MOY_SERVICE   ECART
------ ------ ---- ----------- -------
KING       10 5000     2916,67 2083,33
CLARK      10 2450     2916,67 -466,67
MILLER     10 1300     2916,67 -1616,67

Erreurs frequentes

Erreur OracleCauseCorrection
ORA-00934 : fonction de groupe non autorisee iciAVG place dans un WHEREUtiliser HAVING AVG(SAL) > 2000
ORA-00979 : n’est pas une expression GROUP BYUne colonne du SELECT manque au GROUP BYAjouter la colonne au GROUP BY
ORA-00932 : types de donnees incoherentsAVG sur du texte ou une dateConvertir, ou utiliser MIN/MAX
Moyenne « trop haute »Les NULL sont ignoresAVG(NVL(col, 0)) si les NULL valent 0

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

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

Cours SQL & Oracle — 100% gratuitVoir les cours →