PostgreSQL中两列平均值相除报错,求语法修正方案
问题分析与解决方案
你遇到的错误核心是语法误用:你写的(AVG(CAST("Column1" AS numeric(4,2))),2)这种写法,在PostgreSQL里会被解析成一个包含两个元素的行记录(row value)——第一个元素是Column1的平均值,第二个元素是固定数字2,而不是对平均值进行小数位数保留。当你尝试用两个这样的行做除法时,PostgreSQL无法处理行与行的算术运算,因此抛出了ERROR: row comparison operator must yield type boolean, not type numeric的错误。
正确的写法
如果你想要的是「Column1的平均值 ÷ Column2的平均值」,再保留两位小数作为最终的平均价格,应该用ROUND()函数来包裹整个除法表达式,而不是给平均值加多余的括号和逗号:
SELECT ROUND( AVG(CAST("Column1" AS numeric(4,2))) / AVG(CAST("Column2" AS numeric(4,2))), 2 ) AS average_price FROM table1;
额外说明
你之前单独运行的查询SELECT (AVG(CAST("Column1" AS numeric(4,2))),2) FROM table1其实并没有实现「保留两位小数」的效果——它返回的是一个行类型的结果(比如(12.345, 2)),而不是格式化后的数值。如果要单独对某一列的平均值保留两位小数,正确的写法是:
SELECT ROUND(AVG(CAST("Column1" AS numeric(4,2))), 2) FROM table1;
这样就能得到你期望的、保留两位小数的平均值了。
内容的提问来源于stack exchange,提问作者H_Empty
相关产品推荐
相关产品推荐

