sum (función de XQuery)
Devuelve la suma de una secuencia de números.
Sintaxis
fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType
Argumentos
- $arg
Secuencia de valores atómicos cuya suma se va a calcular.
Notas
Todos los tipos de valores atómicos que se pasan a sum() deben ser subtipos del mismo tipo base. Los tipos base aceptados son los tres tipos numéricos base integrados o xdt:untypedAtomic. Los valores de tipo xdt:untypedAtomic se convierten en xs:double. Si hay un mezcla de estos tipos, o si se pasan otros valores de otros tipos, se produce un error estático.
El resultado de sum() recibe el tipo base de los tipos pasados, como xs:double en el caso de xdt:untypedAtomic, aunque la entrada sea, opcionalmente, una secuencia vacía. Si se trata de una entrada vacía estática, el resultado es 0 con el tipo estático y dinámico xs:integer.
La función sum() devuelve la suma de los valores numéricos. Si un valor xdt:untypedAtomic no puede convertirse en xs:double, el valor se omite en la secuencia de entrada, $arg. Si la entrada es una secuencia vacía calculada dinámicamente, se devuelve el valor 0 del tipo base utilizado.
La función devuelve un error en tiempo de ejecución cuando se produce una excepción por desbordamiento o por valores fuera del intervalo.
Ejemplos
En este tema se proporcionan ejemplos de XQuery con instancias XML almacenadas en varios tipos de columnas xml de la base de datos de AdventureWorks. Para obtener información general de cada una de estas columnas, consulte Representación de tipo de datos xml en la base de datos AdventureWorks.
A. Utilizar la función sum() de XQuery para calcular el número total de horas de trabajo de todos los centros de trabajo del proceso de fabricación
La consulta siguiente averigua el número total de horas de trabajo para todos los centros de trabajo del proceso de fabricación de todos los modelos de producto para los que se almacenan instrucciones de fabricación.
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
El resultado parcial es el siguiente.
<ProductModel PMID="7" ProductModelName="HL Touring Frame">
<TotalLaborHrs>12.75</TotalLaborHrs>
</ProductModel>
<ProductModel PMID="10" ProductModelName="LL Touring Frame">
<TotalLaborHrs>13</TotalLaborHrs>
</ProductModel>
...
En lugar de obtener el resultado como XML, puede escribir la consulta de manera que genere resultados relacionales, como la consulta siguiente:
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
Éste es un resultado parcial:
ProductModelID Name TotalLaborHours
-------------- -------------------------------------------------
7 HL Touring Frame 12.75
10 LL Touring Frame 13
43 Touring Rear Wheel 3
...
Limitaciones de la implementación
Éstas son las limitaciones:
Sólo se admite la versión de sum() de un solo argumento.
Si la entrada es una secuencia vacía calculada dinámicamente, se devuelve el valor 0 del tipo base utilizado, en lugar del tipo xs:integer.
La función sum() asigna todos los valores enteros a xs:decimal.
No se admite la función sum() en valores de tipo xs:duration.
No se admiten secuencias que mezclan tipos entre los límites del tipo base.
sum((xs:double(“INF”), xs:double(“-INF”))) genera un error de dominio.