Partage via


Fonctions d’agrégation : sum

S’applique à :SQL Server

Retourne la somme d'une série de nombres.

Syntaxe

  
fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType  

Arguments

$arg
Série de valeurs atomiques dont la somme est à calculer.

Remarques

Tous les types de valeurs atomisées passées à sum() doivent être des sous-types du même type de base. Les types de base acceptés sont les trois types de base numériques intégrés ou xdt:untypedAtomic. Les valeurs de type xdt:untypedAtomic sont converties en xs:double. S’il existe un mélange de ces types ou si d’autres valeurs d’autres types sont transmises, une erreur statique est générée.

Le résultat de sum() reçoit le type de base du transmis dans des types tels que xs:double dans le cas de xdt:untypedAtomic, même si l’entrée est éventuellement la séquence vide. Si l'entrée est vide statiquement, le résultat est 0 avec le type statique et dynamique de xs:integer.

La fonction sum() retourne la somme des valeurs numériques. Si une valeur xdt:untypedAtomic ne peut pas être convertie en xs:double, la valeur est ignorée dans la séquence d’entrée, $arg. Si l'entrée est une séquence vide calculée dynamiquement, la valeur 0 du type de base utilisé est retournée.

La fonction retourne une erreur d'exécution en cas d'exception de dépassement de capacité ou de valeur hors limite.

Exemples

Cette rubrique fournit des exemples XQuery par rapport aux instances XML stockées dans différentes colonnes de type XML de la AdventureWorks2022 base de données.

R. Utilisation de la fonction XQuery sum() pour rechercher le nombre total d'heures de travail pour tous les ateliers inclus dans le processus de fabrication

La requête ci-dessous permet de trouver le nombre total d'heures de travail pour tous les ateliers inclus dans le processus de fabrication de tous les modèles de produits pour lesquels des instructions de fabrication sont stockées.

SELECT Instructions.query('         
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";         
  <ProductModel PMID= "{ sql:column("Production.ProductModel.ProductModelID") }"         
  ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >         
   <TotalLaborHrs>         
     { sum(//AWMI:Location/@LaborHours) }         
   </TotalLaborHrs>         
 </ProductModel>         
    ') as Result         
FROM Production.ProductModel         
WHERE Instructions is not NULL         

Le résultat partiel est le suivant.

<ProductModel PMID="7" ProductModelName="HL Touring Frame">  
   <TotalLaborHrs>12.75</TotalLaborHrs>  
</ProductModel>  
<ProductModel PMID="10" ProductModelName="LL Touring Frame">  
  <TotalLaborHrs>13</TotalLaborHrs>  
</ProductModel>  
...  

Au lieu de retourner le résultat au format XML, vous pouvez écrire la requête pour générer des résultats relationnels, comme l'illustre la requête suivante :

SELECT ProductModelID,         
        Name,         
        Instructions.value('declare namespace   
      AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";         
    sum(//AWMI:Location/@LaborHours)', 'float') as TotalLaborHours         
FROM Production.ProductModel         
WHERE Instructions is not NULL          

Voici un extrait du résultat :

ProductModelID Name                 TotalLaborHours         
-------------- -------------------------------------------------  
7              HL Touring Frame           12.75                   
10             LL Touring Frame           13                      
43             Touring Rear Wheel         3                       
...  

Limites de mise en œuvre

Les limitations suivantes s'appliquent :

  • Seule la version d’argument unique de sum() est prise en charge.

  • Si l'entrée est une séquence vide calculée dynamiquement, la valeur 0 du type de base utilisé est retournée à la place du type xs:integer.

  • La fonction sum() mappe tous les entiers à xs:decimal.

  • La fonction sum() sur les valeurs de type xs:duration n’est pas prise en charge.

  • Les séquences faisant intervenir plusieurs types dérivés de différents types de base ne sont pas prises en charge.

  • Sum((xs:double(« INF »), xs:double(« -INF »))) génère une erreur de domaine.

Voir aussi

Fonctions XQuery impliquant le type de données xml