sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo redondear (ARRIBA/ABAJO) en SQL Server:5 consejos útiles

Nos han enseñado a redondear números desde que éramos niños. Cuando redondeas 1,15 a las décimas más cercanas, ¿será 1,2 o 1,1? Usar la función SQL ROUND para responder puede confundirlo. Más tarde, verás lo que quiero decir.

[ID de formulario de envío de pulso =”12010″]

Aquí hay otra pregunta. ¿Cuál es la suma de 1 + 1? Esa es una pregunta bastante estúpida. Es para niños que aprenden matemáticas por primera vez, no para nosotros los adultos. Pero, por favor, eche un vistazo al código siguiente:

-- 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

Luego verifique los resultados a continuación:

¿Qué ha pasado aquí? Obtenemos dos valores con una parte decimal. Luego, los redondeamos usando SQL ROUND al número entero más cercano. Sus sumas también se redondean. ¡¿Pero cómo 1 + 1 puede ser 3?!

Un profesional experto en SQL detectará el problema en el código de inmediato. Pero considera esto:

  • Redondear 2,5 al número entero más cercano es 3, no 2.
  • La suma de 1 + 1 es 2.

Es difícil, ¿no?

Aquí está el punto. Si no tiene cuidado, SQL ROUND puede volverlo loco. Esto también puede ser una fuente de discusiones entre desarrolladores y contadores. Una de ellas es cuando se trata del principio de materialidad. Los argumentos pueden ponerse feos.

¿Qué puedes hacer?

Función redonda en SQL Server

No, no te estoy diciendo que le pases este problema al siguiente desarrollador. Esta publicación le brindará los consejos por excelencia para que tanto usted como su usuario estén contentos con el resultado. Algunos de estos consejos también se pueden aplicar al redondeo de un número en la parte frontal de la aplicación o en los informes.

Revisemos nuestros 5 consejos en detalle.

Función de redondeo de números en SQL

Ya sabes cómo redondear números en SQL, ¿por qué preguntar? No se trata de preguntar cómo. Se trata de preguntar cuándo. Puede hacer preguntas similares a las siguientes:

  • ¿Redondeas los valores de entrada ANTES de hacer los cálculos?
  • O bien, ¿calcula los valores de entrada y luego redondea el resultado?

Pueden surgir más preguntas dependiendo de los cálculos que vayas a hacer.

El punto es si obtiene el estándar o el modelo de redondeo de los usuarios. Luego puede usar este modelo para escribir consultas. No asume ni adivina qué conduciría a un desacuerdo más adelante. Y si le ayuda incluir este estándar como una nota en algún lugar del informe, hágalo.

Otra parte del estándar es cuántos lugares decimales usar. ¿Qué sucede si la columna de la tabla tiene un tipo de datos DECIMAL (10,4)? ¿Cómo lo redondearías solo a 2 decimales?

Pruebe el siguiente código:

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)) 

El CAST después de la RONDA mostrará solo dos decimales. Los dos ceros se truncarán:

Comprensión Cómo SQL redondea a decimales

Aquí respondemos a nuestra primera pregunta. Cuando redondeas 1,15 a las décimas más cercanas, ¿será 1,2 o 1,1?

Primero, lo compruebas con el tipo de dato 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

El resultado del código anterior es 1.20 o 1.2:

Pero, ¿y si el tipo de datos es FLOTANTE? Intentemos cambiarlo.

DECLARE @value FLOAT

SET @value = 1.15

SELECT @value
SELECT ROUND(@value, 1)  -- This will result to 1.1

Cual es el resultado? Es 1.1. Véalo usted mismo:

No es que quiera darte más dudas. Sin embargo, debe saber que estos tipos de datos, aunque ambos se usan para números, no son iguales .

  • FLOAT y REAL son números aproximados, no recomendados para redondeo, ni siquiera para comprobaciones de igualdad en una cláusula WHERE.
  • DECIMAL y NUMERIC tienen precisión y escala fijas, y nos referimos a ellos como valores numéricos exactos. Por lo tanto, cuando redondeamos 1,15 a las décimas más cercanas, la respuesta correcta es 1,2.
  • Los números enteros también son números exactos. Son seguros para redondear dígitos enteros.

El dilema parte del diseño de la mesa. Es posible que desee hacer algo con las columnas FLOAT o REAL que se redondearán en alguna parte.

3. Use SQL ROUND en la misma fuente de datos para lograr consistencia

Suponga que necesita crear varios informes de ingresos para mostrar diferentes detalles:el resumen, el desglose detallado por tipo y el desglose detallado por fuente. Todos estos tres informes tratarán los centavos o las partes decimales como inmateriales. Por lo tanto, el redondeo de valores a números enteros es inevitable.

Para obtener resultados uniformes en los tres informes, aplique lo siguiente:

  • SELECCIONE de las mismas tablas base para asegurarse de que los totales de los detalles sean coherentes con el resumen.
  • Utilice el mismo modelo para redondear (punto n.º 1 anterior)

¿Quiere terminar satisfecho con sus usuarios en estos informes de ingresos? Sea constante sobre dónde y cómo obtiene sus números.

4. SQL PISO o TECHO VS REDONDO

Puede haber casos en los que deba redondear hacia arriba o hacia abajo al siguiente número entero. En este caso, CEILING() o FLOOR() es la elección adecuada en lugar de ROUND()

TECHO() redondea un valor al siguiente entero:

SELECT CEILING(1);   -- returns 1 
SELECT CEILING(1.6);  -- returns 2
SELECT CEILING(1.4);  -- returns 2

Mientras tanto, FLOOR() redondea hacia abajo:

SELECT FLOOR(1);   -- returns 1 
SELECT FLOOR(2.1); -- returns 2 
SELECT FLOOR(2.9); -- returns 2

5. Prueba los Resultados con tus Usuarios

Después de completar todas las consultas y el diseño del informe, la parte final es verificar su trabajo con los usuarios. Podemos cometer errores sin importar cuán buenos seamos o cuán duro trabajemos. A veces, necesitamos algunas iteraciones más para hacerlo bien.

Sus usuarios tendrán escenarios de prueba que asegurarán la precisión de los informes. O puede tener un archivo de Excel hecho manualmente para comparar su trabajo con el de ellos. En cualquier caso, trabajar con ellos para un mejor sistema. Te alegrarás de haberlo hecho.

Conclusión

Trabajar con SQL ROUND puede ser difícil a veces. Sin embargo, los consejos presentados aquí prueban que puedes vencer estos obstáculos. ¿Qué has aprendido?

  • Pregunte por el estándar o modelo de redondeo a sus usuarios.
  • Sepa el tipo de datos que está utilizando.
  • Utilice ROUND en la misma fuente de datos para mantener la coherencia.
  • A veces, PISO o TECHO pueden ser más apropiados que REDONDO.
  • Finalmente, pruebe sus resultados con sus usuarios.

¿Es útil esta publicación? Si es para ti, es posible que otros también lo necesiten. Comparte esta publicación en tus redes sociales favoritas.

Artículos relacionados

  1. Cálculo del total acumulado con la cláusula OVER y la cláusula PARTITION BY en SQL Server
  2. Calcular la mediana usando Transact SQL