Обсуждение: Rounding in PGSQL
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
> 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
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