Salt la conținutul principal
Modulul 6 · Lecția 3 din 423/57 în curs~10 min
Lecții din modul (3/4)

Funcții numerice

PostgreSQL are toate funcțiile numerice la care v-ați aștepta - plus câteva capcane de tip care merită cunoscute imediat.

Cele mai utilizate funcții

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) funcționează numai dacă number este NUMERIC (nu DOUBLE PRECISION). În setul nostru de date products.price este NUMERIC(10,2), așa că suntem deja pregătiți.

Diviziune intreg vs zecimal

Capcana clasică:

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

Când împărțiți două INTEGER coloane, obțineți un INTEGER. Pentru a evita trunchiere, aruncați unul dintre ele la NUMERIC sau înmulțiți cu 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 …;

Exemple pe setul de date

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;

Încearcă

Exercițiu#sql.m6.l3.e1
Încercări: 0Se încarcă…

Pentru fiecare produs, afișați numele, prețul (prețul original) și discounted_price (prețul redus cu 10%, rotunjit la 2 zecimale). Comandă după id.

Se încarcă editorul...
Afișează indiciu

Reduceți prețul cu 10% înmulțind cu 0,9, apoi rotunjiți cu ROUND(..., 2).

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m6.l3.e2
Încercări: 0Se încarcă…

Pentru fiecare comandă livrată (starea = „livrată”), afișați id și wait_days ca număr întreg de zile (rotunjit în jos) între ordered_at și shipped_at. Comandă după wait_days descendent, apoi după id.

Se încarcă editorul...
Afișează indiciu

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.

Soluție disponibilă după 3 încercări