Aggregatfunktionen – sum

Gilt für:SQL Server

Gibt die Summe einer Sequenz von Zahlen zurück.

Syntax

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

Argumente

$arg
Sequenz aus atomaren Werten, deren Summe berechnet werden soll.

Bemerkungen

Alle Typen der atomisierten Werte, die an sum() übergeben werden, müssen Untertypen desselben Basistyps sein. Zu den akzeptierten Basistypen zählen die drei integrierten numerischen Basistypen oder xdt:untypedAtomic. Werte des Typs xdt:untypedAtomic werden in xs:double umgewandelt. Wenn eine Mischung dieser Typen vorhanden ist oder andere Werte anderer Typen übergeben werden, wird ein statischer Fehler ausgelöst.

Das Ergebnis von sum() empfängt den Basistyp der übergebenen Typen wie xs:double im Fall von xdt:untypedAtomic, auch wenn die Eingabe optional die leere Sequenz ist. Wenn die Eingabe statisch leer ist, ist das Ergebnis 0 mit dem statischen und dynamischen Typ xs:integer.

Die funktion sum() gibt die Summe der numerischen Werte zurück. Wenn ein xdt:untypedAtomic-Wert nicht in xs:double umgewandelt werden kann, wird der Wert in der Eingabesequenz ignoriert, $arg. Wenn die Eingabe eine dynamisch berechnete leere Sequenz ist, wird der Wert 0 des verwendeten Basistyps zurückgegeben.

Die Funktion gibt einen Laufzeitfehler zurück, wenn ein Ausnahmefehler wegen Überlauf oder Verstoß gegen den Gültigkeitsbereich auftritt.

Beispiele

Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen Xml-Typspalten in der AdventureWorks2022 Datenbank gespeichert sind.

A. Ermitteln der kombinierten Gesamtanzahl der Arbeitsstunden für alle Arbeitsplatzstandorte im Produktionsprozess mit der XQuery-Funktion sum()

Die folgende Abfrage sucht nach der Gesamtanzahl der Arbeitsstunden für alle Arbeitsplatzstandorte im Produktionsprozess aller Produktmodelle, für die Produktionsanweisungen gespeichert sind.

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         

Dies ist das Teilergebnis.

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

Die Abfrage kann auch so geschrieben werden, dass das Resultset nicht als XML-Code zurückgegeben wird, sondern dass relationale Ergebnisse generiert werden, wie das in der folgenden Abfrage gezeigt wird:

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          

Dies ist ein Teilergebnis:

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

Implementierungseinschränkungen

Die folgenden Einschränkungen sind zu beachten:

  • Nur die Einzelargumentversion von sum() wird unterstützt.

  • Wenn die Eingabe eine dynamisch berechnete leere Sequenz ist, wird statt des Typs xs:integer der Wert 0 des verwendeten Basistyps zurückgegeben.

  • Die funktion sum() ordnet alle ganzen Zahlen xs:decimal zu.

  • Die funktion sum() für Werte vom Typ xs:duration wird nicht unterstützt.

  • Sequenzen, die Typen über Basistypbegrenzungen hinweg mischen, werden nicht unterstützt.

  • Die summe((xs:double("INF"), xs:double("-INF"))) löst einen Domänenfehler aus.

Weitere Informationen

XQuery-Funktionen für den xml-Datentyp