Rounding in PGSQL

Started by Jiří Němecover 21 years ago3 messagesgeneral
Jump to latest
#1Jiří Němec
konference@menea.cz

Hello all,

I have got one table with rounding values, table contains
prices and round types.

id price_from price_to rounding
1 0 1500 0.1
2 1500 5000 1
3 5000 15000 10
4 15000 0 100

Eg.:
price = 15.5758, rounded = 15.6
price = 1825.5540, rounded = 1826
price = 7125.123, rounded = 7130
price = 11825.5540, rounded = 11800

Is there some possibility how to write own PGSQL function which I pass in
price, function selects correct value from "rounding" column and
return rounded value?

I have got PHP and MySQL function, it returns correct result but I
need to count rounded price in db becase I have to compare this
rounded price with other records.

function roundValue($value){

$valueAll = (int) $value;

$tmpData = dbClass::fetch_assoc(dbClass::query(
'SELECT rv.rounding
FROM shop_rounding_values rv, shop_rounding r
WHERE rv.value_from <= \''.$valueAll.'\' AND (
rv.value_to > \''.$valueAll.'\' OR rv.value_to=0) AND
rv.rounding_id = r.id AND r.feshow = "y"'));

$rounding = (int) $tmpData['rounding'];

if($rounding == 0){
$value = round($value, 1);
}else if ($rounding == 1){
$value = round($value);
}else{
$value = round($value, substr_count($rounding, '0')*-1);
}

return $value;
}

Thanks for your replies.

--
Jiri Nemec
www.menea.cz - web solutions

#2Mike Nolan
nolan@gw.tssi.com
In reply to: Jiří Němec (#1)
Re: Rounding in PGSQL

Is there some possibility how to write own PGSQL function which I pass in
price, function selects correct value from "rounding" column and
return rounded value?

It's unclear whether you want to store the value in its original form
or in its rounded form.

If the latter, what you need is an 'on insert or update' trigger which
passes the value being inserted or updated through your rounding
function and stores the rounded value.
--
Mike Nolan

#3Joe Conway
mail@joeconway.com
In reply to: Jiří Němec (#1)
Re: Rounding in PGSQL

Jiri Nemec wrote:

id price_from price_to rounding
1 0 1500 0.1
2 1500 5000 1
3 5000 15000 10
4 15000 0 100

Eg.:
price = 15.5758, rounded = 15.6
price = 1825.5540, rounded = 1826
price = 7125.123, rounded = 7130
price = 11825.5540, rounded = 11800

Is there some possibility how to write own PGSQL function which I pass in
price, function selects correct value from "rounding" column and
return rounded value?

Try something like this:

create or replace function ballpark(numeric) returns numeric as '
select case
when $1 <= 1500 then
round($1, 1)
when $1 <= 5000 then
round($1, 0)
when $1 <= 15000 then
round($1, -1)
else
round($1, -2)
end
' language sql;

select ballpark(15.5758),
ballpark(1825.5540),
ballpark(7125.123),
ballpark(11825.5540);
ballpark | ballpark | ballpark | ballpark
----------+----------+----------+----------
15.6 | 1826 | 7130 | 11830
(1 row)

HTH,

Joe