
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
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 )
| Forme | Ce qu’elle fait | Exemple |
|---|---|---|
AVG(col) | Moyenne de toutes les valeurs non nulles (defaut ALL) | AVG(SAL) |
AVG(DISTINCT col) | Moyenne des valeurs distinctes uniquement | AVG(DISTINCT SAL) |
AVG(expression) | Moyenne d’un calcul, pas seulement d’une colonne | AVG(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,142857Oracle 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,67Regle 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,67Erreurs frequentes
| Erreur Oracle | Cause | Correction |
|---|---|---|
ORA-00934 : fonction de groupe non autorisee ici | AVG place dans un WHERE | Utiliser HAVING AVG(SAL) > 2000 |
ORA-00979 : n’est pas une expression GROUP BY | Une colonne du SELECT manque au GROUP BY | Ajouter la colonne au GROUP BY |
ORA-00932 : types de donnees incoherents | AVG sur du texte ou une date | Convertir, ou utiliser MIN/MAX |
| Moyenne « trop haute » | Les NULL sont ignores | AVG(NVL(col, 0)) si les NULL valent 0 |
