Перейти до основного вмісту
Модуль 6 · Урок 3 із 423/57 у курсі~10 min
Модульні уроки (3/4)

Числові функції

PostgreSQL має всі числові функції, які ви очікуєте — плюс декілька введіть підводні камені, про які варто знати відразу.

Найбільш використовувані функції

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) працює, лише якщо number має значення NUMERIC (не DOUBLE PRECISION). У нашому наборі даних products.price це NUMERIC(10,2), тож ми вже готові.

Ціле чи десяткове ділення

Класична пастка:

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

Коли ви розділяєте два стовпці INTEGER, ви отримуєте INTEGER. Щоб уникнути скорочення, переведіть один із них до NUMERIC або помножте на 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 …;

Приклади на наборі даних

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;

Спробуйте

вправи#sql.m6.l3.e1
Спроби: 0Завантаження…

Для кожного продукту вкажіть назву, ціну (початкова ціна) і знижену_ціну (ціна зменшена на 10%, округлена до 2 знаків після коми). Замовлення по id.

Завантаження редактора…
Показати підказку

Зменшіть ціну на 10%, помноживши на 0,9, а потім округліть за допомогою ROUND(..., 2).

Рішення доступне після 3 спроб

Повторна вправа

вправи#sql.m6.l3.e2
Спроби: 0Завантаження…

Для кожного доставленого замовлення (статус = «доставлено») покажіть ідентифікатор і wait_days як ціле число днів (з округленням до меншого) між ordered_at і shipped_at. Впорядкувати за числом днів очікування за спаданням, потім за ідентифікатором.

Завантаження редактора…
Показати підказку

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.

Рішення доступне після 3 спроб