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 stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten vom xml-Datentyp in der AdventureWorks2012 -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 das 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.