ماڈیول اسباق (3/4)
عددی افعال
PostgreSQL میں وہ تمام عددی افعال ہیں جن کی آپ توقع کریں گے — علاوہ کچھ قسم کے نقصانات جو ابھی جاننے کے قابل ہیں۔
سب سے زیادہ استعمال ہونے والے افعال
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) -- 4ROUND(number, decimals) صرف اس صورت میں کام کرتا ہے جب number NUMERIC ہو (نہیں
DOUBLE PRECISION)۔ ہمارے ڈیٹاسیٹ میں products.price ہے NUMERIC(10,2)،
تو ہم پہلے سے ہی تیار ہیں.
عدد بمقابلہ اعشاریہ تقسیم
کلاسک نقصان:
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 سے ضرب دیں:
-- 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 …;ڈیٹا سیٹ پر مثالیں۔
-- 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;اسے آزمائیں
ہر پروڈکٹ کے لیے نام، قیمت (اصل قیمت) اور رعایتی_قیمت (قیمت 10% کم کی گئی، 2 اعشاریہ پر گول کر دی گئی)۔ آئی ڈی سے آرڈر کریں۔
اشارہ دکھائیں۔
قیمت کو 0.9 سے ضرب دے کر 10% کم کریں، پھر ROUND(..., 2) کے ساتھ گول کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ہر ڈیلیور کردہ آرڈر کے لیے (اسٹیٹس = 'ڈیلیور کیا گیا')، id اور 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 کوششوں کے بعد حل دستیاب ہے۔