Aprende SQL · lección gratuita
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.
ROUND(x, n): redondea x a n decimales (ROUND(3.14159, 2) → 3.14). Sin n, redondea a entero. Es redondeo aritmético (0.5 hacia arriba en magnitud).ABS(x): valor absoluto. Útil para diferencias donde el signo no importa (ABS(precio - costo)).% (módulo): resto de la división entera (17 % 2 → 1). Sirve para detectar pares/impares o agrupar.CAST(x AS INTEGER): trunca hacia cero la parte decimal (CAST(3.99 AS INTEGER) → 3). Es la forma portable de "piso" para positivos, ya que el clásico TRUNC no siempre está disponible.entero / entero da entero en SQL. Para obtener decimales fuerza un operando a real: salario * 1.0 / 12 o CAST(salario AS REAL) / 12.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(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.
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
-- 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 sale0o un promedio sin decimales, multiplica por1.0o usaCAST(x AS REAL)en el numerador. Y recuerda:ROUNDredondea,CAST AS INTEGERtrunca; no son intercambiables.
| Función / Operador | Qué hace |
|---|---|
ROUND(x, n) | Redondea x a n decimales (sin n, a entero) |
ABS(x) | Valor absoluto |
x % y | Resto 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 / y | Truco 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 →