Przejdź do głównej treści
eLearner.app
Moduł 6 · Lekcja 3 z 423/57 w kursie~10 min
Lekcje modułu (3/4)

Funkcje numeryczne

PostgreSQL ma wszystkie funkcje numeryczne, których można się spodziewać – plus kilka wpisz pułapki, o których warto wiedzieć od razu.

Najczęściej używane funkcje

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) działa tylko wtedy, gdy number to NUMERIC (nie KODEF3). W naszym zbiorze danych products.price to NUMERIC(10,2), więc już jesteśmy gotowi.

Liczba całkowita a dzielenie dziesiętne

Klasyczna pułapka:

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

Kiedy podzielisz dwie kolumny INTEGER, otrzymasz INTEGER. Aby uniknąć obcięcie, rzuć jeden z nich na NUMERIC lub pomnóż przez 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 …;

Przykłady w zbiorze danych

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;

Spróbuj

Ćwiczenie#sql.m6.l3.e1
Próby: 0Ładowanie...

Przy każdym produkcie wpisz nazwę, cenę (cena pierwotna) i cenę_promocyjną (cena obniżona o 10%, zaokrąglona do 2 miejsc po przecinku). Zamów według identyfikatora.

Ładowanie edytora...
Pokaż wskazówkę

Obniż cenę o 10% mnożąc przez 0,9 i zaokrąglaj przez ZAOKR(..., 2).

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m6.l3.e2
Próby: 0Ładowanie...

Dla każdego dostarczonego zamówienia (status = „dostarczone”) pokaż identyfikator i czas_oczekiwania jako liczbę całkowitą (zaokrągloną w dół) pomiędzy czasem zamówionym i wysłanym. Zamawiaj według Wait_days malejąco, a następnie według identyfikatora.

Ładowanie edytora...
Pokaż wskazówkę

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.

Rozwiązanie dostępne po 3 próbach