Thread: Rounding in PGSQL

Rounding in PGSQL

From
Jiri Nemec
Date:
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


Re: Rounding in PGSQL

From
Mike Nolan
Date:
> 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

Re: Rounding in PGSQL

From
Joe Conway
Date:
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