SUM (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Retourne la somme de toutes les valeurs, ou uniquement des valeurs distinctes (DISTINCT) de l'expression. Les fonctions SUM ne s'emploient que sur des colonnes de type numérique. Les valeurs NULL sont ignorées.

Conventions de la syntaxe Transact-SQL

Syntaxe

-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)

Arguments

ALL

Applique la fonction d'agrégation à toutes les valeurs. ALL est l'argument par défaut.

DISTINCT

Précise que la fonction SUM doit retourner la somme des valeurs uniques.

expression

Constante, colonne ou fonction, et toute combinaison d’opérateurs arithmétiques, au niveau du bit et de chaîne. expression est une expression de la catégorie de type de données numérique exacte ou approximative, à l’exception du type de données bit . Les fonctions d’agrégation et les sous-requêtes ne sont pas autorisées. Pour plus d’informations, consultez Expressions (Transact-SQL)

OVER ( [ partition_by_clause ] order_by_clause)

partition_by_clause divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction est appliquée. S'il n'est pas spécifié, la fonction gère toutes les lignes du jeu de résultats de la requête en un seul groupe. order_by_clause détermine l’ordre logique dans lequel l’opération est effectuée. order_by_clause est requis. Pour plus d’informations, consultez Clause OVER (Transact-SQL).

Types de retour

Renvoie le total de toutes les valeurs expression dans le type de données expression le plus précis.

Résultat de l'expression Type de retour
tinyint int
smallint int
int int
bigint bigint
Catégorie decimal (p, s) decimal(38, s)
Catégorie money et smallmoney money
Catégorie float et real float

Remarques

SUM est une fonction déterministe lorsqu'elle est utilisée sans les clauses OVER et ORDER BY. Il n’est pas déterministe lorsqu’il est spécifié avec les clauses OVER et ORDER BY. Pour plus d’informations, consultez Fonctions déterministes et non déterministes. En outre, SUM peut sembler se comporter comme une fonction non déterministe lorsque vous l’utilisez avec des types de données float et réels . Mais la raison sous-jacente est la nature approximative de ces types de données.

Exemples

R. Utilisation de SUM pour retourner des données de synthèse

Les exemples suivants illustrent l’utilisation de la fonction SUM pour retourner des données de synthèse dans la base de données AdventureWorks2022.

SELECT Color, SUM(ListPrice), SUM(StandardCost)
FROM Production.Product
WHERE Color IS NOT NULL
    AND ListPrice != 0.00
    AND Name LIKE 'Mountain%'
GROUP BY Color
ORDER BY Color;
GO

Voici le jeu de résultats.

Color
--------------- --------------------- ---------------------
Black           27404.84              5214.9616
Silver          26462.84              14665.6792
White           19.00                 6.7926

(3 row(s) affected)

B. Utilisation de la clause OVER

L’exemple suivant utilise la fonction SUM avec la clause OVER pour fournir un total cumulé des ventes annuelles pour chaque secteur dans la table Sales.SalesPerson de la base de données AdventureWorks2022. Les données sont partitionnées par TerritoryID et classées logiquement par SalesYTD. Cela signifie que la fonction SUM est calculée pour chaque secteur selon l'année de vente. Pour TerritoryID 1, il y a deux lignes pour l’année de vente 2005 représentant les deux vendeurs avec des ventes cette année. La valeur cumulée des ventes totales de ces deux lignes est calculée, puis la troisième ligne représentant les ventes de l’année 2006 est incluse dans le calcul.

SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
                                            ORDER BY DATEPART(yy,ModifiedDate)
                                           ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
                                            ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;

Voici le jeu de résultats.

BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274              NULL        2005        559,697.56           559,697.56           559,697.56
287              NULL        2006        519,905.93           539,801.75           1,079,603.50
285              NULL        2007        172,524.45           417,375.98           1,252,127.95
283              1           2005        1,573,012.94         1,462,795.04         2,925,590.07
280              1           2005        1,352,577.13         1,462,795.04         2,925,590.07
284              1           2006        1,576,562.20         1,500,717.42         4,502,152.27
275              2           2005        3,763,178.18         3,763,178.18         3,763,178.18
277              3           2005        3,189,418.37         3,189,418.37         3,189,418.37
276              4           2005        4,251,368.55         3,354,952.08         6,709,904.17
281              4           2005        2,458,535.62         3,354,952.08         6,709,904.17

(10 row(s) affected)

Dans cet exemple, la clause OVER n’inclut pas PARTITION BY. Cela signifie que la fonction sera appliquée à toutes les lignes retournées par la requête. La clause ORDER BY spécifiée dans la clause OVER détermine l'ordre logique selon lequel la fonction SUM est appliquée. La requête retourne le total cumulé des ventes par année pour tous les secteurs de vente spécifiés dans la clause WHERE. La clause ORDER BY spécifiée dans l'instruction SELECT détermine l'ordre dans lequel les lignes de la requête sont affichées.

SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;

Voici le jeu de résultats.

BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274              NULL        2005        559,697.56           2,449,684.05         17,147,788.35
275              2           2005        3,763,178.18         2,449,684.05         17,147,788.35
276              4           2005        4,251,368.55         2,449,684.05         17,147,788.35
277              3           2005        3,189,418.37         2,449,684.05         17,147,788.35
280              1           2005        1,352,577.13         2,449,684.05         17,147,788.35
281              4           2005        2,458,535.62         2,449,684.05         17,147,788.35
283              1           2005        1,573,012.94         2,449,684.05         17,147,788.35
284              1           2006        1,576,562.20         2,138,250.72         19,244,256.47
287              NULL        2006        519,905.93           2,138,250.72         19,244,256.47
285              NULL        2007        172,524.45           1,941,678.09         19,416,780.93
(10 row(s) affected)

Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)

C. Exemple simple de SUM

L’exemple suivant renvoie le nombre total de chaque produit vendu durant l’année 2003.

-- Uses AdventureWorks

SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct
FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
      AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;

Voici un jeu de résultats partiel.

ProductKey  TotalPerProduct
----------  ---------------
214         31421.0200
217         31176.0900
222         29986.4300
225          7956.1500

D. Calcul des totaux dans les groupes comportant plusieurs colonnes

L'exemple suivant calcule la somme de ListPrice et StandardCost pour chaque couleur répertoriée dans la table Product.

-- Uses AdventureWorks

SELECT Color, SUM(ListPrice)AS TotalList,
       SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;

La première partie du jeu de résultats est indiquée ci-dessous :

Color       TotalList      TotalCost
----------  -------------  --------------
Black       101295.7191    57490.5378
Blue         24082.9484    14772.0524
Grey           125.0000       51.5625
Multi          880.7468      526.4095
NA            3162.3564     1360.6185