الانتقال إلى المحتوى الرئيسي
الوحدة 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 (ليس محمي_INLINE_3). في مجموعة البيانات لدينا 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%، مقربًا إلى رقمين عشريين). الطلب حسب المعرف.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتخفيض السعر بنسبة 10% عن طريق الضرب في 0.9، ثم تقريبه بـ ROUND(...، 2).

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m6.l3.e2
المحاولات: 0جارٍ التحميل…

بالنسبة لكل طلب تم تسليمه (الحالة = "تم التسليم")، قم بإظهار المعرف وwait_days كعدد صحيح للأيام (تقريبًا للأسفل) بين Order_at وShiped_at. اطلب حسب wait_days تنازليًا، ثم حسب المعرف.

جارٍ تحميل المحرر…
إظهار التلميح

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 من المحاولات