聚合函数 - sum

适用范围:SQL Server

返回一列数字的和。

语法

  
fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType  

参数

$arg
要计算和的一列原子值。

注解

传递给 sum() 的所有原子化值类型都必须是同一基类型的子类型。 接受的基类型为三种内置数字基类型或 xdt:untypedAtomic。 类型为 xdt:untypedAtomic 的值将转换为 xs:double。 如果这些类型混合在一起,或者传递了其他类型的其他值,则会引发静态错误。

sum() 的结果在 xdt:untypedAtomic 的情况下接收传入的类型(如 xs:double)的基类型,即使输入是空序列(可选)。 如果输入在静态下为空,则对于 xs:integer 的静态和动态类型,结果都为 0。

sum() 函数返回数值的总和。 如果 xdt:untypedAtomic 值不能强制转换为 xs:double,则输入序列中将忽略该值, $arg。 如果输入是动态计算的空序列,则返回的所用基类型的值为 0。

当发生溢出或超出范围异常时,函数将返回一个运行时错误。

示例

本主题针对存储在数据库中各种 xml 类型列中AdventureWorks2022的 XML 实例提供 XQuery 示例。

A. 使用 sum() XQuery 函数查找计算生产过程中所有生产车间的总工时

下面的查询查找在生产(已存储其生产说明的)所有产品型号的过程中所有生产车间的总工时。

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         

下面是部分结果:

<ProductModel PMID="7" ProductModelName="HL Touring Frame">  
   <TotalLaborHrs>12.75</TotalLaborHrs>  
</ProductModel>  
<ProductModel PMID="10" ProductModelName="LL Touring Frame">  
  <TotalLaborHrs>13</TotalLaborHrs>  
</ProductModel>  
...  

您可以编写查询以生成关系结果,而不以 XML 形式返回结果,如下面的查询所示:

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          

这是部分结果:

ProductModelID Name                 TotalLaborHours         
-------------- -------------------------------------------------  
7              HL Touring Frame           12.75                   
10             LL Touring Frame           13                      
43             Touring Rear Wheel         3                       
...  

实现限制

限制如下:

  • 仅支持 sum()单个参数版本。

  • 如果输入是动态计算的空序列,则返回的所用基类型(而不是 xs:integer 类型)的值为 0。

  • sum() 函数将所有整数映射到 xs:decimal。

  • 不支持对 xs:duration 类型的值使用 sum() 函数。

  • 不支持跨基类型边界混合类型的序列。

  • sum(xs:double(“INF”),xs:double(“-INF”)引发域错误。

另请参阅

针对 xml 数据类型的 XQuery 函数