Vai al contenuto
eLearner.app
Modulo 6 · Lezione 3 di 423/57 nel corso~10 min
Lezioni del modulo (3/4)

Funzioni numeriche

PostgreSQL ha tutte le funzioni numeriche che ti aspetti — più qualche trabocchetto sui tipi che è meglio conoscere subito.

Le funzioni più usate

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(numero, decimali) funziona solo se numero è NUMERIC (non DOUBLE PRECISION). Nel nostro dataset products.price è NUMERIC(10,2), quindi è già a posto.

Divisione intera vs decimale

Il trabocchetto classico:

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

Quando dividi due colonne INTEGER ottieni un INTEGER. Per evitare il troncamento, casta uno dei due a NUMERIC o moltiplicalo per 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 …;

Esempi sul dataset

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;

Prova tu

Esercizio#sql.m6.l3.e1
Tentativi: 0Caricamento…

Per ogni prodotto mostra name, price (prezzo originale) e discounted_price (price ridotto del 10%, arrotondato a 2 decimali). Ordina per id.

Caricamento editor…
Mostra suggerimento

Riduci price del 10% moltiplicando per 0.9, poi arrotonda con ROUND(..., 2).

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#sql.m6.l3.e2
Tentativi: 0Caricamento…

Per ogni ordine consegnato (status = 'delivered'), mostra id e wait_days come numero di giorni interi (arrotondati per difetto) fra ordered_at e shipped_at. Ordina per wait_days decrescente, poi per id.

Caricamento editor…
Mostra suggerimento

shipped_at - ordered_at restituisce un INTERVAL; EXTRACT(EPOCH FROM …) lo trasforma in secondi; dividi per 86400 (secondi in un giorno) e prendi il FLOOR.

Soluzione disponibile dopo 3 tentativi