Fonction SQL ORACLE – SUM()

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

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

Publicité
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 )
FormeCe qu’elle faitExemple
SUM(col)Somme de toutes les valeurs non nullesSUM(SAL)
SUM(DISTINCT col)N’additionne chaque valeur qu’une foisSUM(DISTINCT SAL)
SUM(expression)Somme d’un calcul ligne a ligneSUM(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,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.

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           10875

Ecrire 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                  4

Cumul 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  4100

Sans 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 OracleCauseCorrection
ORA-00934 : fonction de groupe non autorisee iciSUM dans un WHEREDeplacer la condition dans HAVING
ORA-00979 : n’est pas une expression GROUP BYColonne du SELECT absente du GROUP BYAjouter la colonne au GROUP BY
Resultat vide au lieu de 0Aucune ligne, ou toutes NULL : SUM renvoie NULLNVL(SUM(col), 0)
ORA-01722 : nombre non valideSomme sur une colonne texte contenant des non-chiffresNettoyer les donnees ou utiliser VALIDATE_CONVERSION

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 →