2014-02-20 80 views
-2

我用Rails 3 & PostgreSQL的

我有一个像列 - > FORMATTED_PRICE: “$ 17.99”

如何我可以在这一列上使用avg吗?

我尝试:

@items = Item.where(:user_id => @category.user_id, :asin => [@category.asins[0..-2].split(',')]).select("asin as asin, title as title, avg(sales_rank) as avg_rank, avg(formatted_price) as avg_price").group(:asin, :title) 

得到一个错误的Cuz AVG(FORMATTED_PRICE)作为avg_price

+2

将数字数据存储为字符串是一种糟糕的代码异味。你能否保证所有数据都是你描述的格式?或者可能会有所不同? – MatBailie

+0

是的:)我想改变它:)只是好奇,如果这可以通过一个选择:) – whitesiroi

+0

货币特别是有问题 - 有理由大多数人使用整数来存储货币 –

回答

3

快速的解决方案:

AVG(CAST(TRIM(LEADING '$' FROM formatted_price) AS NUMERIC)) 

更好的解决方案:列改变到更合适的类型例如金钱或固定的精确数字,并且仅在需要时才将其格式化以用于显示目的。

更新:似乎从注释中看出,该列未按照OP中描述的方式统一格式化。虽然你可以按照MatBailie的建议,使用带有正则表达式的子字符串来提取数字部分以获得平均值,但对于我来说,以不同货币计算一堆货币值的平均值是没有意义的。

因此,可以添加一个where子句以将查询限制为所需货币的查询,或者返回并重新考虑您正在尝试执行的操作。

+0

谢谢:)我得到这个错误PG :: InvalidTextRepresentation:错误:类型数字的无效输入语法:“”我也有像CDN $ 23.32,¥104,... – whitesiroi

+0

@whitesiroi值 - 所以,当我问你是否可以保证***所有的数据都是你建议的格式,***为什么你的回答是以'Yup开始的:'开头的? – MatBailie

+0

对不起。是的,有时候我在这一栏没有任何价值。 – whitesiroi