簡體   English   中英

Rails ActiveRecord在一個查詢中執行Group,Sum和Count

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM