[英]Rails ActiveRecord Perform Group, Sum and Count in one query
我有兩張桌子,
Order (ID, Value)
和
OrderType (ID, Name [Quote, Sale, Purchase, etc])
我想獲得每種類型(計數)的訂單總數以及每種類型的訂單總數(總和)
我可以單獨使用這些
Order.group(:order_type).count(:id)
和
Order.group(:order_type).sum(:value)
我想在一個查詢中執行這些操作,相當於以下SQL
SELECT
order_types.id, Count(*) as total_count, Sum(orders.value) As total_value
FROM
order
JOIN
order_types ON orders.order_type_id = order_types.ID
GROUP BY
order_types.id
查詢還應返回完整的OrderType
對象,以便在視圖中顯示該名稱
由於ActiveRecord在同一查詢中不支持多個聚合函數,因此需要執行一些原始SQL來實現此目的。
grouped_sales = OrderType
.select('order_types.id, order_types.name,
sum(orders.value) as sale, count(*) as purchase')
.join('JOIN orders ON orders.order_type_id = order_types.id')
.group('order_types.id')
這里要注意的是,您需要使用OrderType中的現有列作為聚合列的別名。 在這里,您還將獲得OrderType對象。
要訪問結果:
id -> grouped_sales.first.id
name -> grouped_sales.first.name
total orders -> grouped_sales.first.sale
order value -> grouped_sales.first.purchase
有更好的解決方案,只需:
.pluck('sum(orders.value), count(*)').first
如今采摘+ arel將完成這項工作。
model = Model.arel_table
Model.group(:order_type).pluck(model[:id].count, model[:value].sum)
如果按ID應用默認排序,則可能還需要附加.order(:order_type)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.