Поделиться через


Агрегатные функции — 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")) вызывает ошибку домена.

См. также

Функции XQuery для типа данных XML