ruby-on-rails a如何运行group()和sum()查询并返回不仅仅是sum &活动记录中用于分组的列

o2gm4chl  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(90)

我有两个表,类别(名称,图像数据)和费用(名称,金额,日期),它们通过has_and_belongs_to_many(费用有许多类别,类别有许多费用)相关。我想写一个活动记录查询,它将选择所有类别及其相关费用,并按类别ID分组,同时返回类别表中的其他列(名称& image_data)
我试过了

一、

Category.includes(:expenses).group('categories.id').sum(:amount)

字符串
但我得到的是

{4=>0.75e5, 6=>0.18e6, 5=>0.0}


这不会返回Categories表中的列

二.

k = Category.includes(:expenses).group('categories.id').select('categories.*, SUM(expenses.amount) AS total_amount').pluck('categories.id', 'categories.name', 'total_amount')


但是我得到了一个错误,即列名'total_amount'是未知的。

**3.**我也尝试过根据我想要返回的categories表的所有列对结果进行分组,但我认为这样做会使查询变慢。

Category.includes(:expenses).group('id', 'name', 'image_data').sum(:amount)

vd2z7a6w

vd2z7a6w1#

您必须包括分组中返回的任何列,因此您的第三个选项应该可以使用。这就是聚合在SQL中的工作原理,当你分组和计数/求和时,每个分组列只有一行,所以没有办法包括其他非分组列。

nlejzf6q

nlejzf6q2#

categories = Category.left_joins(:expenses).group(:id).select("categories.*, sum(expcenses.amount) as total")

categories.first.total # => it defines total as a virtual attribute on the model
categories.first.name # => the category fields are also available on the Category model as usual, because of explicitly selected categories.*

字符串
这将返回不含费用的类别(与0总和)。如果要排除它们,请使用.join而不是.left_joins
注意,即使在某些情况下includes可以工作,它也不一定总是工作,因为它也可以只是一个单独的查询,而不是这里需要的连接(内部或左侧)。

相关问题