聚合函数 - 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”)引发域错误。