Partilhar via


Funções agregadas - soma

Aplica-se a:SQL Server

Devolve a soma de uma sequência de números.

Sintaxe

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

Argumentos

$arg
Sequência de valores atómicos cuja soma deve ser calculada.

Comentários

Todos os tipos dos valores atomizados que são passados para sum() devem ser subtipos do mesmo tipo base. Os tipos de base aceitos são os três tipos de base numérica internos ou xdt:untypedAtomic. Os valores do tipo xdt:untypedAtomic são convertidos em xs:double. Se houver uma mistura desses tipos, ou se outros valores de outros tipos forem passados, um erro estático será gerado.

O resultado de sum() recebe o tipo base do passado em tipos como xs:double no caso de xdt:untypedAtomic, mesmo que a entrada seja opcionalmente a sequência vazia. Se a entrada estiver estaticamente vazia, o resultado será 0 com o tipo estático e dinâmico de xs:inteiro.

A função sum() retorna a soma dos valores numéricos. Se um valor xdt:untypedAtomic não puder ser convertido em xs:double, o valor será ignorado na sequência de entrada, $arg. Se a entrada for uma sequência vazia calculada dinamicamente, o valor 0 do tipo base usado será retornado.

A função retorna um erro de tempo de execução quando ocorre uma exceção de estouro ou fora do intervalo.

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks2025.

Um. Usando a função sum() XQuery para encontrar o número total combinado de horas de trabalho para todos os locais do centro de trabalho no processo de fabricação

A consulta a seguir localiza o total de horas de trabalho para todos os locais do centro de trabalho no processo de fabricação de todos os modelos de produtos para os quais as instruções de fabricação são armazenadas.

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         

Este é o resultado parcial.

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

Em vez de retornar o resultado como XML, você pode escrever a consulta para gerar resultados relacionais, conforme mostrado na consulta a seguir:

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          

Este é um resultado parcial:

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

Limitações de implementação

Estas são as limitações:

  • Somente a versão de argumento único de sum() é suportada.

  • Se a entrada for uma sequência vazia calculada dinamicamente, o valor 0 do tipo base usado será retornado em vez do tipo xs:inteiro.

  • A função sum() mapeia todos os inteiros para xs:decimal.

  • A função sum() em valores do tipo xs:duration não é suportada.

  • Não há suporte para sequências que misturam tipos entre limites de tipo base.

  • A soma((xs:double("INF"), xs:double("-INF"))) gera um erro de domínio.

Ver também

funções XQuery em relação ao tipo de dados xml