sum-Funktion (XQuery)

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.

Hinweise

Alle Typen der atomaren 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 es eine Mischung aus diesen Typen gibt, oder wenn andere Werte anderer Typen übergeben werden, wird ein statischer Fehler ausgelöst.

Das Ergebnis von sum() erhält den Basistyp der übergebenen Typen, z. B. xs:double im Fall von xdt:untypedAtomic, selbst 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 sum()-Funktion 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 $arg ignoriert. 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 Spalten des xml-Typs in der AdventureWorks-Datenbank gespeichert sind. Eine Übersicht dieser Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.

A. Verwenden der sum() XQuery-Funktion zum Suchen nach der kombinierten Gesamtanzahl der Arbeitsstunden für alle Arbeitsplatzstandorte im Produktionsprozess

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

Es gelten folgende Einschränkungen:

  • 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 sum()-Funktion ordnet alle ganzzahligen Werte xs:decimal zu.

  • Die sum()-Funktion wird für Werte des Typs xs:duration nicht unterstützt.

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

  • Der Code sum((xs:double(“INF”), xs:double(“-INF”))) löst einen Domänenfehler aus.