我有一个包含一些列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 添加到除法运算中会得到所需的结果,它不会将输出截断为整数值。 感谢
答案 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