Агрегатные функции — sum
Область применения: SQL Server
Возвращает сумму последовательности чисел.
Синтаксис
fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType
Аргументы
$arg
Последовательность атомарных значений, сумма которых должна быть вычислена.
Замечания
Все типы атомизованных значений, передаваемых в sum(), должны быть подтипами одного базового типа. Базовые типы, которые принимаются, — это три встроенных числовых базовых типа или тип xdt:untypedAtomic. Значения типа xdt:untypedAtomic приводятся к типу xs:double. Если имеется смесь этих типов или передаются значения других типов, возникает статическая ошибка.
Результат sum() получает базовый тип переданного типа в таких типах, как xs:double в случае xdt:untypedAtomic, даже если входные данные необязательно являются пустой последовательностью. Если вход статически пуст, результатом будет значение 0 со статическим и динамическим типом xs:integer.
Функция sum() возвращает сумму числовых значений. Если значение xdt:untypedAtomic не может быть приведение к xs:double, значение игнорируется в входной последовательности, $arg. Если вход — это динамически вычисленная пустая последовательность, будет возвращено значение 0 используемого базового типа.
Функция возвращает ошибку времени выполнения, если происходит переполнение или исключение выхода за пределы диапазона.
Примеры
В этом разделе приведены примеры XQuery для экземпляров XML, хранящихся в различных столбцах типа XML в AdventureWorks2022
базе данных.
А. Использование функции языка XQuery sum() для определения полного количества рабочих часов для всех расположений цехов в производственном процессе
Следующий запрос находит общее количество трудовых часов для всех расположений цехов в производственном процессе всех моделей продукта, для которых сохранены производственные команды.
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( ).
Если вход — это динамически вычисленная пустая последовательность, будет возвращено значение 0 используемого базового типа вместо типа xs:integer.
Функция sum() сопоставляет все целые числа с xs:decimal.
Функция sum() для значений типа xs:duration не поддерживается.
не поддерживаются последовательности, в которых смешиваются типы на основе разных базовых типов;
Sum(xs:double("INF"), xs:double("-INF")) вызывает ошибку домена.