Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

Come utilizzare la funzione ROUND() in SQL

Avete bisogno di arrotondare i risultati numerici in SQL? La funzione ROUND() è qui per fare il suo lavoro.

I moderni database relazionali offrono molte funzioni integrate che estendono le capacità di SQL. In questo articolo spiegheremo con esempi pratici il funzionamento della funzione ROUND(). (Attenzione: se avete indovinato che arrotonda un numero a una certa cifra decimale, avete ragione! Continuate a leggere per saperne di più).

Funzioni standard SQL

Ogni database SQL (PostgreSQL, MySQL, Oracle, SQL Server e altri) ha un insieme di funzioni integrate. Per capire cosa significa, parliamo di funzioni.

Una funzione è un pezzo di codice predefinito che trasforma i suoi argomenti in un risultato. Ad esempio, la funzione SUBSTRING() riceve come argomento una stringa di caratteri (ad esempio una parola, una frase, ecc.) e restituisce una parte di questa stringa. Altre funzioni come MAX() (che restituisce il valore più grande) e MIN() (che restituisce il valore più piccolo) elaborano dati numerici; per saperne di più su queste funzioni, consultare l'articolo Cosa sono le funzioni SQL MIN() e MAX()?

Una funzione può essere richiamata in una query SQL ogni volta che è necessario fornire un valore. È possibile richiamare una funzione nell'elenco di colonne SELECT, nella condizione WHERE o in qualsiasi altro punto della query in cui sia necessario fornire un valore. Le funzioni di SQL sono numerose e ogni database SQL ne offre una serie diversa.

Se siete alla ricerca di un corso completo sulle funzioni in SQL, date un'occhiata al nostro corso interattivo su Standard SQL Functions. Il corso copre sia le funzioni SQL di base che quelle avanzate, fornendovi tutto ciò che vi serve per iniziare a usarle per elaborare dati numerici, testuali e di altro tipo nei database SQL.

Che cos'è la funzione SQL ROUND()?

La funzione ROUND in SQL viene utilizzata per arrotondare un dato numero al numero intero più vicino o a una determinata cifra decimale. Mostreremo diversi esempi di query che utilizzano la funzione ROUND(), ma prima introdurremo una tabella SQL di esempio chiamata sales. Questa tabella registra i dati di vendita di un piccolo mercato. Alcuni prodotti (come uova o verdure) sono venduti in base al peso; in questo caso, la colonna quantity registra il numero di chili venduti, che può includere cifre decimali.

dateselleritemQuantity (in units or kilos)unit_pricetotal
2021-12-06CharlesSoda Bbg 500Ml23.236.46
2021-12-06CharlesIce Cream 10Oz22.765.52
2021-12-06CharlesEgg Pack HpyHen1.20.750.9375
2021-12-06CharlesBanana Ecuador1.872.544.7498
2021-12-07CharlesShampoo A10040.993.96
2021-12-07CharlesBatteries A3101.5315.30
2021-12-07MaryCandy Pack B2012.152.15
2021-12-07MaryBanana Ecuador1.472.543.7338
2021-12-07MaryIce Cream 10Oz12.762.76
2021-12-07MarySoda Bbg 500Ml13.233.23
2021-12-08CharlesEgg Pack HpyHen1.430.751.0725

Iniziamo a mostrare una semplice query utilizzando la funzione ROUND() in Standard SQL. Se osserviamo la colonna total nella tabella precedente, possiamo vedere alcuni record sales si possono notare alcuni record in cui il valore ha 3 cifre decimali. Supponiamo di volere un report che mostri tutte le vendite, ma di volere un massimo di 2 cifre decimali nella colonna total. Questa è la query da utilizzare:

SELECT 
  date, 
  seller, 
  item, 
  quantity, 
  unit_price, 
  ROUND(total, 2) AS total
FROM sales

Possiamo notare che la funzione ROUND() riceve due parametri. Il primo è il valore numerico da arrotondare (cioè la colonna total ); il secondo si chiama precision e indica il numero di cifre decimali che vogliamo mantenere nel numero arrotondato. Il risultato di questa query è mostrato di seguito:

dateselleritemquantityunit_pricetotal
2021-12-06CharlesSoda Bbg 500Ml23.236.46
2021-12-06CharlesIce Cream 10Oz22.765.52
2021-12-06CharlesEgg Pack HpyHen1.20.750.94
2021-12-06CharlesBanana Ecuador1.872.544.75
2021-12-07CharlesShampoo A10040.993.96
2021-12-07CharlesBatteries A3101.5315.30
2021-12-07MaryCandy Pack B2012.152.15
2021-12-07MaryBanana Ecuador1.472.543.73
2021-12-07MaryIce Cream 10Oz12.762.76
2021-12-07MarySoda Bbg 500Ml13.233.23
2021-12-08CharlesEgg Pack HpyHen1.430.751.07

Nella colonna total qui sopra, si può vedere il risultato della funzione ROUND(). Si noti che tutti i valori di total hanno due cifre decimali. Il valore è stato arrotondato al centesimo più vicino, il che significa che la trasformazione ROUND() non è un semplice troncamento. Ad esempio, 4.7498 è stato arrotondato a 4,75, che è un valore superiore; 3.7338 è stato arrotondato a 3.73, che è un valore inferiore.

Come regola generale, i numeri con un 5 o più nella posizione decimale specificata vengono arrotondati per eccesso (4,7498 viene arrotondato a 4,75) e i numeri inferiori a 5 vengono arrotondati per difetto (3,7338 viene arrotondato a 3,73).

Utilizzo della funzione ROUND() con un solo argomento

La funzione ROUND() utilizzata nell'esempio precedente aveva due argomenti: il valore da arrotondare e precision (che era 2). precision indica il numero di cifre decimali che si desidera inserire nel risultato. Tuttavia, è possibile omettere il parametro precision; in questo caso ROUND() assume una precisione predefinita di 0 e restituisce valori interi con 0 cifre decimali.

Vediamo un esempio. Supponiamo di voler ottenere i ricavi totali del nostro mercato raggruppati per venditore. Tuttavia, vogliamo un report compatto e semplice, con i valori dei ricavi come numeri interi. Questo è il codice che utilizzeremmo in un database MySQL:

SELECT
  seller, 
  ROUND(SUM(total)) as total_revenue
FROM sales
GROUP BY seller

I risultati sono visibili qui sotto.

sellertotal_revenue
Charles12
Mary38

Uso della funzione SQL ROUND() in diversi database

Nel prossimo esempio, vogliamo mostrare il risultato della funzione ROUND() su alcuni valori specifici, come i valori che finiscono con 0,5 o 0,0. A tale scopo, mostreremo una query che dimostra il funzionamento dell'arrotondamento:

SELECT 1.20 as Value, ROUND(1.20,1) AS "Round(value,1)" 
UNION
SELECT 1.22 as Value, ROUND(1.22,1) AS "Round(value,1)" 
UNION
SELECT 1.25 as Value, ROUND(1.25,1) AS "Round(value,1)" 
UNION
SELECT 1.27 as Value, ROUND(1.27,1) AS "Round(value,1)" 

Le query precedenti utilizzano solo costanti (cioè valori definiti esplicitamente) invece di dati provenienti da una tabella. Per questo motivo non c'è la clausola FROM nella query. I risultati sono:

ValueRound(value,1)
1.201.2
1.221.2
1.251.3
1.271.3

Per quanto riguarda i risultati della funzione ROUND(), possiamo concludere che per i valori nell'intervallo 1.20 - 1.249999, il risultato della funzione ROUND() è 1.2, ma per i valori nell'intervallo 1.25 - 1.299999 il risultato è 1.3. Forse il punto più importante è che 1.25 viene arrotondato a 1.3.

La funzione ROUND() di Oracle è simile alla funzione ROUND() di altri database. Tuttavia, per il tipo di dati BINARY_FLOAT, Oracle implementa una variante dell'algoritmo di arrotondamento chiamata arrotondamento della metà alla pari. Questo arrotonda i numeri con una parte frazionaria di 0,5 al numero intero pari più vicino. Pertanto, ROUND(23.5) restituisce 24 e ROUND(24.5) restituisce anche 24. Come abbiamo detto in precedenza, questo comportamento della funzione ROUND() riguarda solo il tipo di dati BINARY_FLOAT; per altri tipi di dati numerici, ROUND(24.5) restituisce 25. Lo si può vedere nel seguente esempio di query eseguita in Oracle.

SELECT	
  binary_float_value,
  ROUND(binary_float_value), 
  numeric_value,
  ROUND(numeric_value) 
FROM test_round_with_float;

Nei risultati si può notare la differenza tra i due tipi di dati. ROUND(24.5) restituisce 24 quando il tipo di dati dell'argomento è BINARY_FLOAT; restituisce 25 quando il tipo di dati è qualsiasi altro tipo di dati numerici (come NUMBER).

BINARY_FLOAT_VALUEROUND(BINARY_FLOAT_VALUE)NUMERIC_VALUEROUND(NUMERIC_VALUE)
23.52423.524
24.52424.525

L'uso di SQL ROUND() con precisione negativa

ROUND() offre una funzionalità diversa quando il parametro di precisione è un numero negativo. Nell'esempio seguente, possiamo ottenere il multiplo più vicino di 100 utilizzando ROUND(value, -2). Per mostrare questa funzionalità utilizzeremo una query simile alla precedente:

SELECT 12345 as Value, ROUND(12345,-2) AS "Round(value,-2)" 
UNION
SELECT 12355 as Value, ROUND(12355,-2) AS "Round(value,-2)" 
UNION
SELECT 12350 as Value, ROUND(12350,-2) AS "Round(value,-2)" 
UNION
SELECT 101 as Value, ROUND(101,-2) AS "Round(value,-2)" 
UNION
SELECT 199 as Value, ROUND(199,-2) AS "Round(value,-2)" 
UNION
SELECT 99 as Value, ROUND(99,-2) AS "Round(value,-2)" 

La query attuale viene eseguita in MS SQL Server. Come nella query precedente, continuiamo a utilizzare dati costanti per mostrare il funzionamento di ROUND(). È possibile vedere come il parametro precision di -2 funzioni su valori diversi. Il risultato di ROUND(value, -2) è il multiplo di 100 più vicino a value. Lo si può vedere nel risultato della query qui sotto:

ValueRound(value, -2)
1234512300
1235512400
1235012400
101100
199200
99100

Utilizzo di ROUND() in WHERE

Nell'esempio seguente, mostreremo come utilizzare la funzione SQL ROUND() nella clausola WHERE di una query. Supponiamo di voler creare un report che mostri tutti gli articoli il cui prezzo ha una parte decimale inferiore a 50 centesimi. La condizione seguente identificherà questi prezzi:

ROUND(unit_price) < unit_price

L'idea alla base della condizione precedente è la seguente. Quando la parte decimale della colonna unit_price è inferiore a 0,50, la funzione ROUND(unit_price) restituisce un valore inferiore (se il prezzo è 3.23 allora ROUND(3.23) restituisce 3.00, che è inferiore a 3,23). L'intera query SQL è quindi:

SELECT 
  distinct item, 
  unit_price,
  unit_price - ROUND(unit_price) AS decimal_part
FROM sales
WHERE ROUND(unit_price) < unit_price

Abbiamo anche aggiunto un campo supplementare chiamato decimal_part nell'elenco SELECT per mostrare come calcolare la parte decimale di un numero usando la funzione ROUND(). La query precedente è stata eseguita in un database PostgreSQL; i risultati sono visibili qui sotto:

itemunit_pricedecimal_part
Candy Pack B202.150.15
Soda Bbg 500Ml3.230.23

Se desiderate maggiori informazioni sulla funzione SUM(), vi suggerisco di leggere l'articolo SQL SUM() Function Explained with 5 Practical Examples.

Utilizzare le funzioni SQL per potenziare le query

In questo articolo abbiamo spiegato la funzione ROUND() in SQL utilizzando esempi tratti da diversi database. Indipendentemente dal database che preferite, ora sapete come funziona ROUND() e come potete utilizzarlo nelle vostre query e nei vostri report.

Prima di concludere, ho un'altra raccomandazione per voi. Il nostro foglio informativo gratuito Standard SQL Functions vi permette di trovare rapidamente informazioni sulle funzioni integrate di SQL, sulle funzioni aggregate e su molto altro ancora. Lo uso quasi ogni giorno quando lavoro con SQL. E non dimenticate il nostro Standard SQL Functions dove potete imparare ed esercitarvi con le funzioni numeriche, di testo e di data. Aumentate le vostre competenze, aumentate le vostre risorse!