మాడ్యూల్ పాఠాలు (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) -- 4number NUMERIC (కాదు) అయితే ROUND(number, decimals) మాత్రమే పని చేస్తుంది
DOUBLE PRECISION). మా డేటాసెట్లో products.price NUMERIC(10,2),
కాబట్టి మేము ఇప్పటికే సెట్ చేసాము.
పూర్ణాంకం vs దశాంశ విభజన
క్లాసిక్ ఆపద:
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 దశాంశాలకు గుండ్రంగా ఉంటుంది). ID ద్వారా ఆర్డర్ చేయండి.
సూచనను చూపించు
0.9తో గుణించడం ద్వారా ధరను 10% తగ్గించండి, ఆపై ROUND(..., 2)తో రౌండ్ చేయండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం సమీక్షించండి
డెలివరీ చేయబడిన ప్రతి ఆర్డర్ కోసం (స్టేటస్ = 'డెలివరీ చేయబడింది'), id మరియు wait_daysని order_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 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది