Passer au contenu principal
eLearner.app
Module 6 · Leçon 3 sur 423/57 dans le cours~10 min
Leçons du module (3/4)

Fonctions numériques

PostgreSQL possède toutes les fonctions numériques auxquelles vous pouvez vous attendre, plus quelques-unes tapez les pièges qui valent la peine d'être connus tout de suite.

Les fonctions les plus utilisées

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) ne fonctionne que si number est NUMERIC (pas DOUBLE PRECISION). Dans notre ensemble de données, products.price est NUMERIC(10,2), donc nous sommes déjà prêts.

Division entière ou décimale

Le piège classique :

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

Lorsque vous divisez deux colonnes INTEGER, vous obtenez un INTEGER. A éviter troncature, convertissez l'un d'eux en NUMERIC ou multipliez par 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 …;

Exemples sur l'ensemble de données

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;

Essayez-le

Exercice#sql.m6.l3.e1
Tentatives : 0Chargement…

Pour chaque produit, indiquez le nom, le prix (prix d'origine) et discounted_price (prix réduit de 10 %, arrondi à 2 décimales). Commande par identifiant.

Chargement de l'éditeur…
Afficher l'indice

Réduisez le prix de 10 % en multipliant par 0,9, puis arrondissez avec ROUND(..., 2).

Solution disponible après 3 tentatives

Exercice de révision

Exercice#sql.m6.l3.e2
Tentatives : 0Chargement…

Pour chaque commande livrée (statut = 'delivered'), affichez l'identifiant et wait_days sous la forme d'un nombre entier de jours (arrondi à l'inférieur) entre Ord_at et Shiped_at. Triez par wait_days décroissant, puis par identifiant.

Chargement de l'éditeur…
Afficher l'indice

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.

Solution disponible après 3 tentatives