
La fonction SQL ORACLE SUM retourne la somme des valeurs d’une colonne d’une table ou d’une sélection. Cette fonction ne peut être utilisée qu’avec des champs numériques
SELECT SUM(SAL) FROM EMP ; SUM(SAL) ---------------------- 29025
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Les valeurs nulles sont considérées comme des 0 par cette fonction et la somme de toutes les valeurs nulles est nulle
SELECT SUM(COMM) FROM EMP WHERE COMM IS NULL ; SUM(COMM) ----------------------
Syntaxe complete de SUM
SUM( [ DISTINCT | ALL ] expression )
| Forme | Ce qu’elle fait | Exemple |
|---|---|---|
SUM(col) | Somme de toutes les valeurs non nulles | SUM(SAL) |
SUM(DISTINCT col) | N’additionne chaque valeur qu’une fois | SUM(DISTINCT SAL) |
SUM(expression) | Somme d’un calcul ligne a ligne | SUM(SAL * 12) |
SUM(CASE ...) | Somme conditionnelle (voir plus bas) | SUM(CASE WHEN ... THEN 1 ELSE 0 END) |
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.
Somme par groupe et filtrage avec HAVING
WHERE filtre les lignes avant le regroupement, HAVING filtre les groupes apres. C’est la distinction la plus mal comprise du SQL.
SELECT DEPTNO, SUM(SAL) AS masse_salariale
FROM EMP
WHERE JOB <> 'PRESIDENT' -- exclut des LIGNES
GROUP BY DEPTNO
HAVING SUM(SAL) > 8000 -- exclut des GROUPES
ORDER BY masse_salariale DESC;
DEPTNO MASSE_SALARIALE
------ ---------------
30 9400
20 10875Ecrire WHERE SUM(SAL) > 8000 declenche ORA-00934: fonction de groupe non autorisee ici : au moment du WHERE, les groupes n’existent pas encore.
La somme conditionnelle : compter et sommer en une passe
Technique tres rentable : au lieu de plusieurs requetes, un seul balayage de la table produit tous les totaux, grace a SUM(CASE ...).
SELECT COUNT(*) AS total,
SUM(CASE WHEN SAL >= 3000 THEN 1 ELSE 0 END) AS nb_hauts_salaires,
SUM(CASE WHEN SAL >= 3000 THEN SAL ELSE 0 END) AS masse_hauts_salaires,
SUM(CASE WHEN COMM IS NOT NULL THEN 1 ELSE 0 END) AS nb_avec_commission
FROM EMP;
TOTAL NB_HAUTS_SALAIRES MASSE_HAUTS_SALAIRES NB_AVEC_COMMISSION
----- ----------------- -------------------- ------------------
14 3 11000 4Cumul progressif avec OVER (running total)
Pour un cumul qui progresse ligne apres ligne — solde bancaire, chiffre d’affaires cumule — la version analytique est l’outil adapte.
SELECT ENAME, SAL,
SUM(SAL) OVER (ORDER BY SAL, ENAME
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) AS cumul
FROM EMP
ORDER BY SAL, ENAME;
ENAME SAL CUMUL
------ ---- -----
SMITH 800 800
JAMES 950 1750
ADAMS 1100 2850
WARD 1250 4100Sans la clause ROWS BETWEEN, Oracle applique RANGE par defaut et regroupe les ex æquo sur la meme valeur de cumul. Precisez toujours la fenetre si les doublons vous genent.
Erreurs frequentes
| Erreur Oracle | Cause | Correction |
|---|---|---|
ORA-00934 : fonction de groupe non autorisee ici | SUM dans un WHERE | Deplacer la condition dans HAVING |
ORA-00979 : n’est pas une expression GROUP BY | Colonne du SELECT absente du GROUP BY | Ajouter la colonne au GROUP BY |
| Resultat vide au lieu de 0 | Aucune ligne, ou toutes NULL : SUM renvoie NULL | NVL(SUM(col), 0) |
ORA-01722 : nombre non valide | Somme sur une colonne texte contenant des non-chiffres | Nettoyer les donnees ou utiliser VALIDATE_CONVERSION |
