Ci è stato insegnato ad arrotondare i numeri sin da quando eravamo bambini. Quando arrotondi 1,15 ai decimi più vicini, sarà 1,2 o 1,1? L'utilizzo della funzione SQL ROUND per rispondere potrebbe confonderti. Più tardi capirai cosa intendo.
[sendpulse-form id=”12010″]
Ecco un'altra domanda. Qual è la somma di 1 + 1? È una domanda piuttosto stupida. È per i bambini che imparano la matematica per la prima volta, non per noi adulti. Ma per favore dai un'occhiata al codice qui sotto:
-- Variables for input values
DECLARE @value1 DECIMAL(3,2) = 1.05
DECLARE @value2 DECIMAL(3,2) = 1.45
DECLARE @sum1 DECIMAL(3,2) = @value1 + @value2
-- Variables for rounded values
DECLARE @roundedValue1 TINYINT = ROUND(@value1,0)
DECLARE @roundedvalue2 TINYINT = ROUND(@value2,0)
DECLARE @sum2 TINYINT = ROUND(@sum1,0)
-- Surprise!
SELECT 'sum of ' + CAST(@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1, @sum1 AS Sum1
SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2, @sum2 AS Sum2
Quindi controlla i risultati di seguito:
Cosa è successo qui? Otteniamo due valori con una parte decimale. Quindi, li arrotondiamo usando SQL ROUND al numero intero più vicino. Anche le loro somme sono arrotondate. Ma come può 1 + 1 essere 3?!
Un esperto SQL esperto individuerà immediatamente il problema nel codice. Ma considera questo:
- L'arrotondamento di 2,5 al numero intero più vicino è 3, non 2.
- La somma di 1 + 1 è 2.
È difficile, vero?
Ecco il punto. Se non stai attento, SQL ROUND può farti impazzire. Questo può anche essere fonte di discussioni tra sviluppatori e contabili. Uno di questi è quando si ha a che fare con il principio di materialità. Gli argomenti possono diventare brutti.
Cosa puoi fare?
Funzione rotonda in SQL Server
No, non ti sto dicendo di passare questo problema al prossimo sviluppatore. Questo post ti darà consigli per eccellenza per rendere felici sia te che il tuo utente con il risultato. Alcuni di questi suggerimenti possono essere applicati anche per arrotondare un numero sul lato front-end dell'app o nei rapporti.
Esaminiamo in dettaglio i nostri 5 consigli.
Funzione di arrotondamento per i numeri in SQL
Sai già come arrotondare i numeri in SQL, quindi perché chiedere? Non si tratta di chiedersi come. Si tratta di chiedere quando. Puoi fare domande simili come di seguito:
- Arrotondi i valori di input PRIMA di eseguire i calcoli?
- Oppure calcoli i valori di input e poi arrotondi il risultato?
Possono sorgere altre domande a seconda dei calcoli che farai.
Il punto è se si ottiene lo standard di arrotondamento o il modello dagli utenti. Quindi puoi utilizzare questo modello per scrivere query. Non presumi o indovini cosa porterebbe a un disaccordo in seguito. E se è utile includere questo standard come nota da qualche parte nel rapporto, fallo.
Un'altra parte dello standard è il numero di cifre decimali da utilizzare. Cosa succede se la colonna della tabella ha un tipo di dati DECIMAL(10,4)? Come lo arrotonderai solo a 2 cifre decimali?
Prova il codice qui sotto:
DECLARE @value DECIMAL(10,4)
SET @value = 8346.1556
-- This will result in 8346.16 instead of 8346.1600
SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2))
Il CAST dopo il ROUND visualizzerà solo due cifre decimali. I due zeri verranno troncati:
Capire Come SQL arrotonda alle posizioni decimali
Qui rispondiamo alla nostra prima domanda. Quando arrotondi 1,15 ai decimi più vicini, sarà 1,2 o 1,1?
Innanzitutto, lo controlli con il tipo di dati DECIMAL:
DECLARE @value DECIMAL(3,2)
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result in 1.2 or 1.20
Il risultato del codice sopra è 1.20 o 1.2:
Ma cosa succede se il tipo di dati è un FLOAT? Proviamo a cambiarlo.
DECLARE @value FLOAT
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result to 1.1
Qual'è il risultato? È 1.1. Guarda tu stesso:
Non è che voglio darti più dubbi. Tuttavia, devi sapere che questi tipi di dati, sebbene entrambi utilizzati per i numeri, non sono creati uguali .
- FLOAT e REAL sono numeri approssimativi, non consigliati per gli arrotondamenti, nemmeno per i controlli di uguaglianza in una clausola WHERE.
- DECIMAL e NUMERIC hanno precisione e scala fisse e le chiamiamo numeri esatti. Pertanto, quando arrotondiamo 1,15 ai decimi più vicini, la risposta corretta è 1,2.
- Anche gli interi sono numeri esatti. Sono sicuri per arrotondare cifre intere.
Il dilemma parte dal design del tavolo. Potresti voler fare qualcosa per le colonne FLOAT o REAL che verranno arrotondate da qualche parte.
3. Usa SQL ROUND sulla stessa origine dati per coerenza
Si supponga di dover creare diversi rapporti sulle entrate per mostrare diversi dettagli:il riepilogo, la ripartizione dettagliata per tipo e la ripartizione dettagliata per fonte. Tutti questi tre rapporti tratteranno i centesimi o le parti decimali come irrilevanti. Quindi, arrotondare i valori ai numeri interi è inevitabile.
Per risultati coerenti in tutti e tre i rapporti, applica quanto segue:
- SELEZIONARE dalle stesse tabelle di base per garantire che i totali dei dettagli siano coerenti con il riepilogo.
- Utilizzare lo stesso modello per arrotondare (punto n. 1 sopra)
Vuoi essere soddisfatto dei tuoi utenti in questi rapporti sulle entrate? Sii coerente su dove e come ottieni i tuoi numeri.
4. SQL PAVIMENTO o SOFFITTO VS ROTONDA
Potrebbero esserci casi in cui è necessario arrotondare per eccesso o per difetto al numero intero successivo. In questo caso, CEILING() o FLOOR() è la scelta appropriata invece di ROUND()
CEILING() arrotonda un valore al numero intero successivo:
SELECT CEILING(1); -- returns 1
SELECT CEILING(1.6); -- returns 2
SELECT CEILING(1.4); -- returns 2
Nel frattempo, FLOOR() arrotonda per difetto:
SELECT FLOOR(1); -- returns 1
SELECT FLOOR(2.1); -- returns 2
SELECT FLOOR(2.9); -- returns 2
5. Testa i risultati con i tuoi utenti
Dopo aver completato tutte le query e la progettazione del rapporto, la parte finale consiste nel controllare il tuo lavoro con gli utenti. Possiamo commettere errori non importa quanto siamo bravi o quanto duro lavoriamo. A volte, abbiamo bisogno di qualche iterazione in più per farlo bene.
I tuoi utenti disporranno di scenari di test che garantiranno l'accuratezza dei rapporti. Oppure potrebbe avere un file Excel eseguito manualmente per confrontare il tuo lavoro con il loro. In ogni caso, lavora con loro per un sistema migliore. Sarai felice di averlo fatto.
Conclusione
Lavorare con SQL ROUND a volte può essere difficile. Tuttavia, i suggerimenti presentati qui dimostrano che puoi vincere contro questi ostacoli. Che cosa hai imparato?
- Chiedi ai tuoi utenti lo standard o il modello di arrotondamento.
- Conosci il tipo di dati che stai utilizzando.
- Usa ROUND sulla stessa origine dati per coerenza.
- A volte, PAVIMENTO o SOFFITTO potrebbero essere appropriati rispetto a TONDO.
- Infine, testa i tuoi risultati con i tuoi utenti.
Questo post è utile? Se è per te, anche altri potrebbero averne bisogno. Condividi questo post sui tuoi social media preferiti.
Articoli correlati
- Calcolo del totale parziale con la clausola OVER e la clausola PARTITION BY in SQL Server
- Calcola la mediana utilizzando Transact SQL