Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 3 de 423/57 en el curso~10 min
Lecciones del módulo (3/4)

Funciones numéricas

PostgreSQL tiene todas las funciones numéricas que esperarías, además de algunas escriba errores que vale la pena conocer de inmediato.

Las funciones más utilizadas

SQL
ROUND(price, 2)     -- arrotonda a 2 decimali (banker's rounding "half to even")
CEIL(price)         -- arrotonda per eccesso (verso +∞)
FLOOR(price)        -- arrotonda per difetto (verso −∞)
ABS(-5)             -- 5  (valore assoluto)
MOD(10, 3)          -- 1  (resto della divisione)  — anche 10 % 3
POWER(2, 10)        -- 1024
SQRT(16)            -- 4

ROUND(number, decimals) sólo funciona si number es NUMERIC (no CÓDIGOPH3). En nuestro conjunto de datos products.price es NUMERIC(10,2), así que ya estamos listos.

División entera vs decimal

El error clásico:

SQL
SELECT 1 / 2;          -- 0  (entrambi interi → divisione intera!)
SELECT 1.0 / 2;        -- 0.5
SELECT 1::numeric / 2; -- 0.50000000000000000000

Cuando divides dos columnas INTEGER obtienes un INTEGER. para evitar truncamiento, transmita uno de ellos a NUMERIC o multiplíquelo por 1.0:

SQL
-- Sbagliato: percentuale sempre 0 finché numeratore < denominatore
SELECT shipped / total FROM …;

-- Corretto:
SELECT shipped::numeric / total FROM …;
SELECT ROUND(shipped * 100.0 / total, 2) AS percentage FROM …;

Ejemplos en el conjunto de datos

SQL
-- Prezzo scontato del 10%, arrotondato a 2 decimali:
SELECT name,
       price,
       ROUND(price * 0.9, 2) AS discounted_price
FROM   products
ORDER BY id;

-- Prezzo "psicologico" sempre arrotondato per eccesso al multiplo di 1:
SELECT name, CEIL(price) AS rounded_price
FROM   products
WHERE  price < 100
ORDER BY price;

Pruébalo

Ejercicio#sql.m6.l3.e1
Intentos: 0Cargando...

Para cada producto muestra el nombre, el precio (precio original) y el precio_descuento (precio reducido en un 10%, redondeado a 2 decimales). Ordenar por id.

Cargando editor...
Mostrar pista

Reduzca el precio en un 10% multiplicando por 0,9, luego redondee con ROUND(..., 2).

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m6.l3.e2
Intentos: 0Cargando...

Para cada pedido entregado (estado = 'entregado'), muestre id y wait_days como el número entero de días (redondeado hacia abajo) entre el pedido_en y el envío_en. Ordene por días de espera descendente, luego por id.

Cargando editor...
Mostrar pista

shipped_at - ordered_at returns an INTERVAL; EXTRACT(EPOCH FROM …) turns it into seconds; divide by 86400 (seconds in a day) and take the FLOOR.

Solución disponible después de 3 intentos