Retour à la liste des articles Articles
13 minutes de lecture

Comment utiliser SUM() avec GROUP BY : Un guide détaillé avec 8 exemples

Découvrez des exemples concrets d'utilisation de SUM() et GROUP BY en SQL, des plus basiques aux plus sophistiqués.

SUM() SUM() est une fonction agrégée SQL qui calcule la somme des valeurs données. GROUP BY est une clause SQL qui divise les lignes en groupes et calcule une fonction agrégée pour chaque groupe. En utilisant ces deux fonctions ensemble, vous pouvez calculer les sommes totales pour un groupe de lignes.

Dans cet article, nous verrons 8 exemples différents de la manière dont vous pouvez combiner SUM() et GROUP BY pour créer de nombreux rapports différents. Nous aborderons les cas d'utilisation les plus basiques ainsi que des scénarios plus complexes.

La meilleure façon de rafraîchir vos connaissances en SQL - y compris SUM() et GROUP BY - est notre cours interactif de Exercices Pratiques de SQL. Il contient 88 exercices interactifs qui couvrent différents sujets SQL. Ce cours est parfait pour préparer un entretien ou pour réviser avant un examen SQL.

Exemple 1 : Utilisation de base de SUM() et GROUP BY en SQL

Voyons un exemple d'utilisation de la fonction SUM() avec GROUP BY:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

La requête renvoie une liste de tous les pays trouvés dans le tableau orders ainsi que la somme totale des quantités commandées pour chaque pays. Les lignes du tableau orders sont divisées en groupes (un groupe pour chaque pays) et la base de données additionne les valeurs des quantités pour chaque pays.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

Analyse détaillée de l'exemple 1

Analysons cet exemple en détail.

Voici les données du tableau orders . Cette table est courante dans un système de commerce électronique ; outre le pays de destination des marchandises et la quantité commandée, elle contient des données sur le vendeur qui a pris la commande, l'UGS du produit, la date de la commande et l'adresse du client.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand

Nous utiliserons la table des commandes tout au long de cet article.

La fonction SUM() en SQL

La fonction SUM() est l'une des fonctions d'agrégation de SQL. Les fonctions d'agrégation en SQL renvoient une valeur unique pour un ensemble de lignes. La fonction SUM() renvoie la somme des arguments donnés à la fonction. Il existe d'autres fonctions d'agrégation SQL, mais nous nous concentrerons uniquement sur SUM() dans cet article.

Si nous ajoutons SUM() à la requête ...

SELECT SUM(quantity)
FROM orders;

... nous n'obtiendrons qu'une seule valeur, résultant de la somme de toutes les valeurs de quantité :

SUM(quantity)
122

Notez que la fonction SUM() ignore les valeurs NULL. Elles sont traitées comme des 0 dans le calcul. Pour plus d'informations sur la fonction SUM(), vous pouvez lire cette explication complète de la fonction SQL SUM().

La fonction SUM(), comme les autres fonctions d'agrégation, est généralement utilisée avec la clause GROUP BY.

La clause GROUP BY en SQL

La clause GROUP BY est utilisée pour calculer les statistiques d'un groupe de lignes ; les lignes sont réparties en groupes en fonction des valeurs d'une ou de plusieurs colonnes. L'instruction SELECT avec GROUP BY renvoie une seule ligne pour chaque groupe distinct défini dans la clause GROUP BY.

Revenons à notre requête d'exemple :

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

Les lignes de la table orders sont réparties en groupes en fonction de la valeur de la colonne country grâce à cette ligne : GROUP BY country. Elle indique à la base de données de placer les lignes ayant la même valeur country dans un seul groupe.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States

Les lignes relatives au Mexique sont placées dans un groupe, celles relatives à la Nouvelle-Zélande dans un autre groupe, et ainsi de suite. La fonction SUM() est ensuite appliquée aux valeurs quantitatives de chaque groupe. La somme pour les États-Unis est la somme de 10, 12 et 15, ce qui donne 37. La somme pour le Royaume-Uni est la somme de 18 et 25, ce qui donne 43, etc.

Voici à nouveau le résultat de notre requête. Vous pouvez voir que chaque ligne contient la somme des valeurs de quantité dans le groupe correspondant.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

La clause GROUP BY est particulièrement utile lorsque vous souhaitez obtenir des informations récapitulatives à partir de tableaux comportant trop de lignes pour les parcourir une à une. Pour plus d'informations, lisez une explication complète de la clause SQL GROUP BY ou cet article expliquant GROUP BY en SQL.

Exemple 2 : Calculer 2 SOMMES et grouper par 2 colonnes

Dans l'exemple précédent, nous avons vu comment utiliser SUM() et GROUP BY pour grouper un ensemble de données par la colonne pays et obtenir la quantité totale pour chaque pays séparément. Vous pouvez également regrouper les données par plusieurs colonnes avec GROUP BY et calculer plus d'une somme dans une requête.

Si nous voulons connaître toutes les combinaisons de country et salesperson dans le tableau et obtenir le total des quantités commandées et leurs montants pour chaque combinaison, nous devons utiliser SUM() et GROUP BY.

Voici la requête :

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Sur la base du tableau ci-dessus, cette requête produit les données suivantes :

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Nous avons deux expressions qui utilisent la fonction SUM() dans la requête : l'une calcule la quantité totale et l'autre calcule le montant total. Nous regroupons également les données en fonction de deux colonnes : country et salesperson.

En interne, le moteur de base de données exécute la procédure suivante :

  1. Il crée un ensemble de résultats à partir de la table spécifiée dans la clause FROM, en regroupant les lignes pour chaque combinaison de valeurs des colonnes spécifiées dans la clause GROUP BY. Dans notre exemple, les lignes ayant la même valeur de country et salesperson sont regroupées : il y a une ligne pour les ventes de Meghan aux États-Unis, une ligne pour les ventes de Stephen aux États-Unis, etc.
  2. Pour chaque ligne de l'ensemble de résultats créé à l'étape précédente, il calcule la somme de chaque colonne entourée d'un SUM(). Dans notre exemple, il calcule la somme des colonnes quantity et la somme des colonnes amount.
  3. Il renvoie l'ensemble de résultats avec les sommes.

Vous pouvez effectuer des regroupements sur plus de deux colonnes si nécessaire. Pour en savoir plus sur le regroupement par plusieurs colonnes, consultez notre article Comment regrouper par plusieurs colonnes en SQL.

Exemple 3 : Utilisation d'une condition WHERE avec SUM et GROUP BY

Vous pouvez utiliser une condition WHERE dans votre requête avec SUM() et GROUP BY. Dans ce cas, le moteur de base de données modifie la procédure vue ci-dessus pour renvoyer les résultats de la requête. Il applique la clause WHERE à l'étape 1 de la procédure. Ensuite, l'ensemble de résultats initial sera constitué des lignes qui remplissent la condition WHERE.

Les colonnes concernées par la condition WHERE peuvent être n'importe quelles colonnes de la table. Il importe peu qu'elles soient ou non énumérées dans la clause GROUP BY ou qu'elles soient ou non renvoyées en tant que résultat de la requête.

Dans notre exemple, nous pourrions utiliser n'importe quelle colonne de la table orders par exemple product_sku ou order_date. Nous sommes intéressés par les commandes pour le produit avec le SKU 990048006427 qui ont été faites entre le 7 avril 2023 et le 8 avril 2023.

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE 
  product_sku = '990048006427' 
  AND order_date BETWEEN '2023-04-07' AND '2023-04-08'
GROUP BY country, salesperson;

Pour résoudre cette requête, le moteur de base de données va d'abord créer un ensemble de résultats temporaire à partir de la table orders qui répond aux conditions de la clause WHERE. À partir de cet ensemble de résultats, il prend toutes les combinaisons des colonnes country et salesperson. Pour chaque combinaison, il calculera les sommes de quantity et amount.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
MexicoMeghan12912.45

Notez que lorsque nous comparons le résultat avec l'exemple 2, nous n'incluons que les commandes effectuées entre le 7 avril 2023 et le 8 avril 2023 pour le produit 990048006427. Par exemple, il n'y a pas de ligne pour les ventes de Meghan aux États-Unis, car elle n'a pas vendu ce produit au cours de ces deux journées d'avril.

Exemple 4 : Utilisation de la clause ORDER BY avec SUM et GROUP BY

Si nous ajoutons une clause ORDER BY à la requête que nous avons construite avec SUM() et GROUP BY, le moteur de base de données devra faire un peu plus de travail. Cette étape consiste à trier les résultats en fonction des critères spécifiés dans la clause ORDER BY.

Par exemple, nous pourrions trier les résultats en fonction de la somme de amount, en la référençant par son alias amntTotal. Nous pouvons également spécifier l'expression complète SUM(amount):

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal, 
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson
ORDER BY amntTotal DESC;

Dans cet exemple, nous ajoutons la clause DESC pour que les résultats soient triés du plus élevé au plus bas.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
United KingdomStephen181012.66
United StatesArthur15914.42
MexicoMeghan12912.45
United StatesMeghan10845.25
New ZealandArthur16842.06
New ZealandStephen14799.45
United StatesStephen12705.5
MexicoArthurNULLNULL

Exemple 5 : Expressions de somme

Outre son application à des colonnes individuelles, la fonction SUM peut également être appliquée à des expressions renvoyant des valeurs numériques. Supposons que nous ayons une colonne unit_price au lieu d'une colonne de montant. Le montant de la commande résulterait de la multiplication de quantity par unit_price.

Pour que la requête SQL SUM GROUP BY renvoie une somme des montants ordonnés dans ce cas, nous devons appliquer la fonction SUM() à l'expression quantity * unit_price:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(quantity * unit_price) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Le résultat de la requête serait le même que dans l'exemple 2 :

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

La procédure exécutée par le moteur de base de données serait un peu différente. Pour chaque groupe, il calculera d'abord la valeur de l'expression quantity * unit_price, puis il calculera les sommes en utilisant les valeurs calculées.

Exemple 6 : Valeurs nulles dans la fonction SUM()

Lors de l'utilisation de la fonction SUM() dans SQL, NULLs est ignoré et n'est pas inclus dans le calcul du total. Si une ligne du tableau orders a des valeurs NULL dans les colonnes quantity ou amount, elles seront ignorées par la fonction SUM(). L'exception est si toutes les valeurs sont NULL pour l'une des colonnes, auquel cas la fonction SUM() renverra également NULL.

Cette mise en garde concerne la combinaison SUM() et GROUP BY. S'il existe des combinaisons de valeurs des colonnes GROUP BY dont toutes les valeurs totales sont NULL, alors SUM() renverra également NULL pour cette combinaison de valeurs.

Dans notre exemple de tableau de commande, toutes les lignes de country='Mexico' et salesperson='Arthur' ont une valeur NULL en termes de quantité et de montant. C'est pourquoi le résultat de SUM() et GROUP BY renvoie NULL dans la somme de la quantité et du montant pour country = 'Mexico' et salesperson = 'Arthur'. Cependant, ni Arthur ni Mexico ne sont NULS dans aucune de leurs autres combinaisons.

Jetez un coup d'œil :

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE country = 'Mexico' AND Salesperson = 'Arthur'
GROUP BY country, salesperson;
countrysalespersonqtyTotalamntTotal
MexicoArthurNULLNULL

Si une nouvelle ligne était insérée pour country = 'Mexico' et salesperson = 'Arthur' avec des valeurs nonNULL dans quantity et amount, le reste des valeurs NULL serait ignoré dans le total. Les résultats de SUM() n'incluraient que les valeurs qui n'ont pas NULLs dans les colonnes additionnées.

Exemple 7 : Conversion des valeurs NULL en zéros

Nous avons vu que la fonction SUM() renvoie NULL si toutes les valeurs de la colonne additionnée sont NULL. S'il n'y a qu'une seule valeur nonNULL, les autres valeurs NULL sont ignorées, c'est-à-dire qu'elles sont traitées comme si elles étaient nulles.

Cela peut être difficile à expliquer lorsque l'on fait de la narration de données. Nous voulons éviter que le mot "NULL" n'apparaisse dans une boîte de résultats où devrait figurer un nombre (ce qui sèmerait la confusion dans l'esprit de notre public). Dans ce cas, il est pratique de convertir les valeurs de NULL en zéros. Pour ce faire, vous pouvez utiliser la fonction COALESCE. Elle convertit les valeurs NULL d'une colonne en une valeur définie - généralement zéro, bien que d'autres valeurs puissent être utilisées.

Dans notre exemple, nous ne voulons pas courir le risque que des valeurs NULL dans quantity ou amount fassent apparaître du texte "NULL" dans nos résultats. Nous pouvons enfermer ces colonnes dans la fonction COALESCE et envoyer le résultat en tant que paramètre de la fonction SUM():

SELECT 
  country, 
  salesperson, 
  SUM(COALESCE(quantity, 0)) AS qtyTotal,
  SUM(COALESCE(amount, 0)) AS amntTotal
FROM orders
GROUP BY country, salesperson;

De cette manière, tous les NULLs dans les colonnes additionnées apparaîtront comme des zéros.

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthur00.00
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Notez que la ligne relative aux ventes d'Arthur au Mexique affiche désormais 0 au lieu de NULL.

Exemple 8 : SUM() avec des conditions

Parfois, nous voulons que la combinaison GROUP BY SUM() ne prenne en compte que les données qui répondent à certaines conditions.

En poursuivant notre exemple, supposons que chaque commande possède une colonne de type BIT appelée delivered qui indique si la commande a été livrée ou non. Nous pourrions souhaiter que les résultats de nos sommations soient divisés en deux : un total de produits livrés et un total de produits non livrés. La solution consiste à utiliser CASE WHEN dans la fonction SUM() pour évaluer le contenu de la colonne delivered:

SELECT 
  country,
  SUM(CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END) AS qtyTotalDelivered,
  SUM(CASE 
    WHEN delivered = 0 THEN quantity 
    ELSE 0 END) AS qtyTotalNotDelivered
FROM orders
GROUP BY country;

L'instruction CASE WHEN est similaire à l'instruction IF dans de nombreux langages de programmation ; elle ajoute une certaine logique au flux de notre requête en évaluant une condition énoncée. Elle donne la condition après WHEN. Si la condition est remplie, la valeur après THEN est renvoyée. Si la condition n'est pas remplie, la valeur après ELSE est renvoyée.

CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END

Dans cette expression, nous renvoyons la colonne quantity pour les produits livrés. Pour les autres produits, nous renvoyons 0.

Voici le résultat de la requête :

countryqtyTotalDeliveredqtyTotalNotDelivered
United States2215
United Kingdom1825
Mexico12NULL
New Zealand1416

Pour en savoir plus sur l' utilisation de CASE WHEN avec SUM et GROUP BY, consultez notre blog.

Entraînez-vous à utiliser SUM() avec GROUP BY dans vos requêtes SQL

Tout au long de cet article, nous avons vu huit exemples de la façon de combiner SUM() et GROUP BY dans des requêtes SQL. Notre table orders Bien qu'elle ne contienne que quelques lignes, notre table représente des situations réelles.

Dans votre travail, vous rencontrerez souvent des situations similaires à celles que nous avons présentées - mais vos tableaux seront peuplés de beaucoup plus de lignes. Vous devrez alors utiliser toutes les variantes possibles de SUM() et GROUP BY pour prouver que les résultats de vos requêtes sont légitimes.

Profitez de notre Exercices Pratiques de SQL cours et La pratique du SQL de notre cours et de notre piste pour perfectionner vos compétences en SQL. N'oubliez pas : L'aspect le plus critique du travail d'un analyste de données est que les informations qu'il fournit sont fiables à 100 %.