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.