Ana içeriğe geç
Modül 6 · Ders 3 ders 4Kurstaki 23/57~10 min
Modül dersleri (3/4)

Sayısal işlevler

PostgreSQL, beklediğiniz tüm sayısal işlevlere ek olarak birkaç taneye sahiptir. hemen bilmeye değer olan tuzakları yazın.

En çok kullanılan işlevler

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) yalnızca number NUMERIC ise çalışır (değil DOUBLE PRECISION). Veri kümemizde products.price NUMERIC(10,2) şeklindedir, yani zaten hazırız.

Tam sayı ve ondalık bölme

Klasik tuzak:

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

İki INTEGER sütununu böldüğünüzde INTEGER elde edersiniz. Kaçınmak için kesme, bunlardan birini NUMERIC olarak yayınlayın veya 1.0 ile çarpın:

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 …;

Veri kümesindeki örnekler

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;

Deneyin

Egzersiz#sql.m6.l3.e1
Denemeler: 0Yükleniyor…

Her ürün için adı, fiyatı (orijinal fiyat) ve indirimli_fiyat'ı (fiyat %10 azaltılmış, 2 ondalığa yuvarlanmış) gösterir. Kimliğe göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

Fiyatı 0,9 ile çarparak %10 azaltın, ardından YUVARLAK(..., 2) ile yuvarlayın.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m6.l3.e2
Denemeler: 0Yükleniyor…

Teslim edilen her sipariş için (durum = 'teslim edildi'), id ve wait_days'i, sipariş_at ile sevk_at arasındaki tam gün sayısı (aşağı yuvarlanmış) olarak gösterin. Azalan wait_days'e, ardından kimliğe göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

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 denemeden sonra çözüm mevcut