Direct naar de hoofdinhoud
Module 6 · Les 3 van 423/57 in de cursus~10 min
Modulelessen (3/4)

Numerieke functies

PostgreSQL heeft alle numerieke functies die u zou verwachten, plus een paar type valkuilen die de moeite waard zijn om meteen te weten.

De meest gebruikte functies

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) werkt alleen als number NUMERIC is (niet DOUBLE PRECISION). In onze dataset is products.price NUMERIC(10,2), dus we zijn al klaar.

Geheel getal versus decimale deling

De klassieke valkuil:

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

Wanneer u twee INTEGER kolommen deelt, krijgt u een INTEGER. Om te vermijden afkappen, werp een van hen naar NUMERIC of vermenigvuldig met 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 …;

Voorbeelden van de 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;

Probeer het

Oefening#sql.m6.l3.e1
Pogingen: 0Laden…

Voor elk product worden de naam, prijs (oorspronkelijke prijs) en kortingsprijs (prijs verlaagd met 10%, afgerond op 2 decimalen) weergegeven. Bestel op ID.

Editor laden…
Toon hint

Verlaag de prijs met 10% door te vermenigvuldigen met 0,9 en rond vervolgens af met RONDE(..., 2).

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m6.l3.e2
Pogingen: 0Laden…

Geef voor elke afgeleverde bestelling (status = 'bezorgd') id en wait_days weer als het gehele aantal dagen (naar beneden afgerond) tussen besteld_at en verzonden_at. Bestel op wachtdagen aflopend en vervolgens op ID.

Editor laden…
Toon hint

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.

Oplossing beschikbaar na 3 pogingen