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.

Consulte también

Funciones de XQuery con el tipo de datos xml