Funções de Agregação – sum
Aplica-se: SQL Server
Retorna 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 de valores atomizados que são passados para sum() devem ser subtipos do mesmo tipo base. Os tipos base aceitos são os três tipos base numéricos internos ou xdt:untypedAtomic. 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, será gerado um erro estático.
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:integer.
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 dinamicamente calculada, o valor 0 do tipo base usado será retornado.
A função retorna um erro de runtime quando um estouro ou exceção fora do intervalo acontece.
Exemplos
Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas de tipo xml no AdventureWorks2022
banco de dados.
R. Usando a função sum() XQuery para localizar o número combinado total de horas de trabalho para todos os locais do centro de trabalho no processo de fabricação.
A consulta a seguir acha o total de horas de trabalho de todos os locais de centro de trabalho no processo de fabricação de todos os modelos de produtos nos 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, como mostrado nesta consulta:
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:
Apenas a versão de argumento único de sum() é suportada.
Se a entrada for uma sequência vazia dinamicamente calculada, o valor 0 do tipo base usado será retornado, em vez do tipo xs:integer.
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, atravessando os limites de tipo base.
A soma((xs:double("INF"), xs:double("-INF"))) gera um erro de domínio.