Funciones de agregado: sum
Se aplica a:SQL Server
Devuelve la suma de un flujo 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.
Comentarios
Todos los tipos de los valores atomizados 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 del tipo xdt:untypedAtomic se convierten a xs:double. Si hay una combinación de estos tipos, o si se pasan otros valores de otros tipos, se genera 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, incluso si la entrada es opcionalmente la 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 se puede convertir a 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 en instancias XML almacenadas en varias columnas de tipo xml de la AdventureWorks2022
base de datos.
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:
Solo se admite la versión de argumento único de sum().
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 enteros a xs:decimal.
No se admite la función sum() en valores de tipo xs:duration.
No se admiten las secuencias que mezclan tipos en límites de tipo base.
La suma((xs:double("INF"), xs:double("-INF"))) genera un error de dominio.