Aprende SQL · lección gratuita

Lección 09 · Funciones numéricas y de redondeo

Resumen

Las funciones numéricas transforman valores en cálculos: redondean, truncan, sacan valor absoluto o aplican aritmética. En SQL son fundamentales para reportes financieros donde necesitas presentar precios, márgenes y porcentajes con la precisión correcta. SQLite ofrece un núcleo pequeño pero potente (ROUND, ABS, %, CAST) que, combinado con aritmética, cubre la mayoría de casos de negocio.

Sintaxis / Conceptos

El peligro de la división entera

En SQLite, 7 / 2 devuelve 3, no 3.5, porque ambos operandos son enteros. Este es uno de los errores silenciosos más comunes: el cálculo "funciona" pero entrega un valor incorrecto. La solución es multiplicar por 1.0 o usar CAST(... AS REAL) en al menos un operando para forzar aritmética de punto flotante. Por ejemplo, para el margen porcentual de un producto usa (precio - costo) 100.0 / precio, nunca (precio - costo) 100 / precio.

ROUND vs CAST: redondear vs truncar

ROUND(3.7) da 4 (redondea al más cercano). CAST(3.7 AS INTEGER) da 3 (trunca, descarta decimales). Para precios casi siempre quieres ROUND; para "cuántas unidades enteras caben" quieres truncar. Cuidado: CAST trunca hacia cero, así que CAST(-3.7 AS INTEGER) es -3, no -4.

Combinar con printf

Para mostrar siempre dos decimales (incluso cuando terminan en cero, como 1200.50), ROUND no basta porque ROUND(1200.5, 2) muestra 1200.5. Ahí se usa printf('%.2f', x), que veremos en la siguiente lección, pero ya puedes combinarlo con cálculos numéricos.

SELECT nombre, precio, ROUND(precio * 1.18, 2) AS precio_con_igv FROM productos LIMIT 6

Ejemplos

-- Margen absoluto y margen porcentual de cada producto, redondeado a 1 decimal.
-- Fíjate en el 100.0 para forzar división real y evitar la división entera.
SELECT
  nombre,
  precio,
  costo,
  precio - costo                              AS margen,
  ROUND((precio - costo) * 100.0 / precio, 1) AS margen_pct
FROM productos
ORDER BY margen_pct DESC
LIMIT 8;

-- Truncar vs redondear: precio promedio por categoría (división real),
-- mostrando ambas formas de "convertir a entero".
SELECT
  categoria_id,
  ROUND(AVG(precio), 2)        AS promedio_redondeado,
  AVG(precio)                  AS promedio_exacto,
  CAST(AVG(precio) AS INTEGER) AS promedio_truncado
FROM productos
GROUP BY categoria_id
ORDER BY categoria_id;

-- Módulo: clasificar productos por id par o impar.
SELECT
  id,
  nombre,
  CASE WHEN id % 2 = 0 THEN 'par' ELSE 'impar' END AS paridad
FROM productos
ORDER BY id
LIMIT 6;

-- ABS para una diferencia sin signo: distancia del precio respecto al promedio global.
SELECT
  nombre,
  precio,
  ABS(precio - (SELECT AVG(precio) FROM productos)) AS distancia_al_promedio
FROM productos
ORDER BY distancia_al_promedio ASC
LIMIT 5;
💡 El error #1 con números en SQL es la división entera. Si un porcentaje te sale 0 o un promedio sin decimales, multiplica por 1.0 o usa CAST(x AS REAL) en el numerador. Y recuerda: ROUND redondea, CAST AS INTEGER trunca; no son intercambiables.

Cheatsheet

Función / OperadorQué hace
ROUND(x, n)Redondea x a n decimales (sin n, a entero)
ABS(x)Valor absoluto
x % yResto de la división entera (módulo)
CAST(x AS INTEGER)Trunca decimales hacia cero (piso para positivos)
CAST(x AS REAL)Convierte a punto flotante para forzar división decimal
x * 1.0 / yTruco para forzar división real entre enteros
MIN(x,y) / MAX(x,y)Menor / mayor de dos o más valores escalares

---

← Lógica condicional: CASE y manejo de NULLFunciones de texto →

Ver todas las lecciones de Aprende SQL →