Sdílet prostřednictvím


Agregační funkce – součet

platí pro:SQL Server

Vrátí součet posloupnosti čísel.

Syntax

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

Argumenty

$arg
Posloupnost atomických hodnot, jejichž součet se má vypočítat

Poznámky

Všechny typy atomizovaných hodnot, které jsou předány sum() musí být podtypy stejného základního typu. Základní typy, které jsou přijímány, jsou tři předdefinované číselné základní typy nebo xdt:untypedAtomic. Hodnoty typu xdt:untypedAtomic se přetypují na xs:double. Pokud existuje kombinace těchto typů nebo pokud jsou předány jiné hodnoty jiných typů, vyvolá se statická chyba.

Výsledek sum() obdrží základní typ předaných v typech, jako je xs:double v případě xdt:untypedAtomic, i když vstup je volitelně prázdná sekvence. Pokud je vstup staticky prázdný, výsledek je 0 se statickým a dynamickým typem xs:integer.

Funkce sum() vrátí součet číselných hodnot. Pokud xdt:untypedAtomic hodnotu nelze přetypovat na xs:double, hodnota je ignorována ve vstupní sekvenci $arg. Pokud je vstup dynamicky počítanou prázdnou sekvencí, vrátí se hodnota 0 použitého základního typu.

Funkce vrátí chybu za běhu, když dojde k přetečení nebo výjimce mimo rozsah.

Příklady

Toto téma obsahuje příklady XQuery pro instance XML, které jsou uloženy v různých xml sloupce typu v databázi AdventureWorks2022.

A. Použití funkce sum() XQuery k nalezení celkového kombinovaného počtu pracovních hodin pro všechna místa pracovního centra ve výrobním procesu

Následující dotaz najde celkovou pracovní dobu pro všechna umístění pracovních center ve výrobním procesu všech modelů produktů, pro které jsou výrobní pokyny uloženy.

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         

Jedná se o částečný výsledek.

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

Místo vrácení výsledku jako XML můžete napsat dotaz pro generování relačních výsledků, jak je znázorněno v následujícím dotazu:

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          

Jedná se o částečný výsledek:

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

Omezení implementace

Toto jsou omezení:

  • Podporuje se pouze verze jednoho argumentu sum().

  • Pokud je vstup dynamicky počítanou prázdnou sekvencí, vrátí se místo typu xs:integer hodnota 0 použitého základního typu.

  • Funkce sum() mapuje všechna celá čísla na xs:decimal.

  • Funkce sum() pro hodnoty typu xs:duration není podporována.

  • Sekvence, které kombinují typy napříč hranicemi základního typu, se nepodporují.

  • Sum((xs:double("INF"), xs:double("-INF"))) vyvolá chybu domény.

Viz také

funkce XQuery proti datového typu XML