选择查询自定义计算列以舍入到2个小数位

时间:2014-02-05 14:45:19

标签: postgresql amazon-redshift

我有一个包含一些列a,b的表,我需要添加一个自定义列c_avg,它将具有该值 c_avg = a * 100 / b最多2个十进制值

我的原始表是这样的东西

id a b
1  1 2
2  2 3
3  2 0

我已经提出了这个查询,但似乎这会将值返回为整数。

select round( CAST((CASE WHEN b=0 THEN '0.00'
        ELSE round(((a*100)/b),2)
   END ) as numeric) , 2) as c_avg
from table_name

我将输出作为

输出
a b c_avg
1 2 0
2 3 0

我需要这样的东西

a b c_avg
1 2 0.50
2 3 0.66
2 0 0

我在亚马逊红移上的Postgresql版本是PostgreSQL 8.0.2

我正在用这个表做一些事情

select sum(a) as aa, sum(b) as bb, groub_by_column
round( CAST((CASE WHEN sum(b)=0 THEN '0.00'
    ELSE round(((sum(a)*100)/sum(b)),2)
    END ) as numeric) , 2) as c_avg
from table group by groub_by_column

这会将我的值返回0而不是0。*

由于

postgresql中的除法运算截断为整数值 刚发现

select round((4000/576::float),3) as result;

将meta :: float 添加到除法运算中会得到所需的结果,它不会将输出截断为整数值。 感谢

6 个答案:

答案 0 :(得分:5)

postgresql中的除法运算截断为整数值,只是发现了

select round((4000/576::float),3) as result;

将meta :: float 添加到除法运算中会得到所需的结果,它不会将输出截断为整数值。

由于

答案 1 :(得分:3)

在处理整数时,结果也是一个整数 - 乘以浮点值得到一个浮点结果:

SELECT
    sum(a) as aa,
    sum(b) as bb,
    group_by_column,
    CASE
        WHEN 0 = sum(b) THEN 0.0
        ELSE ROUND(100.0 * sum(b) / sum(b), 2)
    END AS c_avg
FROM table_name
GROUP BY group_by_column

答案 2 :(得分:1)

Postgres会进行整数除法,因此请尝试以下版本的查询:

select round((CASE WHEN b=0 THEN 0.00
                   ELSE a*100.0)/b
              END), 2) as c_avg
from table_name;

您也可以通过将结果转换为小数来执行此操作:

select cast((case when b = 1 then 0 else a*100.0/b end) as decimal(5, 2)) as c_avg
from table_name;

答案 3 :(得分:0)

试试这个:

SELECT to_char (1/2::FLOAT, 'FM999999990.00');
--- RESULT: 0.50

或者简单地说:

SELECT round (2/3::DECIMAL, 2)::TEXT
--- RESULT: 0.67

答案 4 :(得分:0)

这是一个老问题,但我发现转换为 DECIMAL(10, 2) 可能是在红移中四舍五入到小数点后两位的最佳/最简单的方法。其他答案都不适合我。

SELECT 10.4494685::DECIMAL(10,2)
-- OUTPUT 10.45

答案 5 :(得分:-1)

你需要演员

select round( (2/3), 2) produces 0
select round( (2/3::numeric), 2) produces 0.67