דילוג לתוכן המרכזי
מודול 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 עשרונים). הזמנה לפי תעודת זהות.

טוען עורך...
הצג רמז

הפחת את המחיר ב-10% על ידי הכפלה ב-0.9, ולאחר מכן עיגל עם ROUND(..., 2).

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m6.l3.e2
ניסיונות: 0טוען...

עבור כל הזמנה שנמסרה (סטטוס = 'מסירה'), הצג את id ו-wait_days כמספר הימים השלם (מעוגל כלפי מטה) בין ordered_at לבין shipped_at. הזמינו לפי wait_days descending, ולאחר מכן לפי id.

טוען עורך...
הצג רמז

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 ניסיונות