Condividi tramite


Funzioni di aggregazione - sum

Si applica a:SQL Server

Restituisce la somma di una sequenza di numeri.

Sintassi

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

Argomenti

$arg
Sequenza di valori atomici per i quali deve essere calcolata la somma.

Osservazioni:

Tutti i tipi dei valori atomizzati passati a sum() devono essere sottotipi dello stesso tipo di base. I tipi di base accettati sono i tre tipi numerici di base predefiniti o xdt:untypedAtomic. Per i valori di tipo xdt:untypedAtomic viene eseguito il cast a xs:double. In presenza di una combinazione di questi tipi o nel caso in cui vengano passati altri valori di altri tipi, viene restituito un errore statico.

Il risultato di sum() riceve il tipo di base dei tipi passati, ad esempio xs:double nel caso di xdt:untypedAtomic, anche se l'input è facoltativamente la sequenza vuota. Se l'input è costituito da dati statici vuoti, il risultato sarà 0 con il tipo statico e dinamico di xs:integer.

La funzione sum() restituisce la somma dei valori numerici. Se non è possibile eseguire il cast di un valore xdt:untypedAtomic a xs:double, il valore viene ignorato nella sequenza di input $arg. Se l'input è una sequenza vuota calcolata in modo dinamico, viene restituito il valore 0 del tipo di base utilizzato.

Se si verifica un overflow o un'eccezione di valori non compresi nell'intervallo, la funzione restituisce un errore di run-time.

Esempi

In questo argomento vengono forniti esempi di XQuery su istanze XML archiviate in varie colonne di tipo xml nel AdventureWorks2022 database.

R. Utilizzo della funzione XQuery sum() per trovare il numero totale combinato delle ore di manodopera relativo a tutti i centri di lavorazione del processo di produzione

La query seguente trova il numero totale delle ore di manodopera relativo a tutti i centri di lavorazione del processo di produzione per tutti i modelli di prodotto per i quali sono state archiviate istruzioni di produzione.

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         

Di seguito è riportato il risultato parziale.

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

Anziché restituire il risultato come codice XML, è possibile scrivere la query in modo da generare risultati relazionali, come illustrato nella query seguente:

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          

Risultato parziale:

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

Limitazioni di implementazione

Limitazioni:

  • È supportata solo la versione a argomento singolo di sum().

  • Se l'input è una sequenza vuota calcolata in modo dinamico, viene restituito il valore 0 del tipo di base utilizzato anziché il tipo xs:integer.

  • La funzione sum() esegue il mapping di tutti gli interi a xs:decimal.

  • La funzione sum() sui valori di tipo xs:duration non è supportata.

  • Non sono supportate le sequenze con combinazioni di tipi che non rispettano i limiti del tipo di base.

  • Sum((xs:double("INF"), xs:double("-INF"))) genera un errore di dominio.

Vedi anche

Funzioni XQuery per il tipo di dati XML