使用Postgres在ActiveRecord查询中混淆计算结果,分组和求和

时间:2015-06-10 05:30:10

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我试图通过将OrderItem乘以unit_price并减去quantity,然后按{{line_discount进行分组来计算每个product_id的总价值1}}并对line_total求和,这样我就可以得到每个产品的总行数。

我先试了这个:

OrderItem.select("order_items.*, 
order_items.unit_price * order_items.quantity - order_items.line_discount AS line_total 
GROUP BY product_id").sum('line_total')

但是我收到了这个错误:

PG::UndefinedColumn: ERROR:  column "line_total" does not exist
LINE 1: SELECT SUM(line_total) AS sum_line_total, product_id...
             ^
: SELECT SUM(line_total) AS sum_line_total, product_id AS product_id FROM "order_items" GROUP BY product_id
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "line_total" does not exist
LINE 1: SELECT SUM(line_total) AS sum_line_total, product_id...

我在这里找到了一些问题,其中答案表明在子查询中包装查询的别名部分是解决方案,但我尝试了几个变体并且不断得到相同的错误。

我试过的子查询的一些变体:

OrderItem.select("order_items.*, 
(SELECT order_items.unit_price * order_items.quantity - order_items.line_discount AS line_total 
GROUP BY order_items.product_id)").sum('line_total')

OrderItem.select("order_items.*, 
(SELECT unit_price * quantity - line_discount AS line_total 
FROM order_items GROUP BY order_items.product_id)").sum('line_total')

OrderItem.select("order_items.*, 
(SELECT order_items.unit_price * order_items.quantity - order_items.line_discount AS line_total)")
.group(:product_id).sum("line_total")

如何调整此查询以返回我正在寻找的结果?

1 个答案:

答案 0 :(得分:1)

如果您愿意放弃选择所有字段(您可能不想要的话,因为您只是按product_id进行分组),此查询将为您执行此操作:

OrderItem.group("product_id").sum("unit_price * quantity - line_discount")

结果将是一个哈希,其中键是product_ids,值是总和。