我有两个表,类别(名称,图像数据)和费用(名称,金额,日期),它们通过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)
型
2条答案
按热度按时间vd2z7a6w1#
您必须包括分组中返回的任何列,因此您的第三个选项应该可以使用。这就是聚合在SQL中的工作原理,当你分组和计数/求和时,每个分组列只有一行,所以没有办法包括其他非分组列。
nlejzf6q2#
字符串
这将返回不含费用的类别(与0总和)。如果要排除它们,请使用
.join
而不是.left_joins
。注意,即使在某些情况下
includes
可以工作,它也不一定总是工作,因为它也可以只是一个单独的查询,而不是这里需要的连接(内部或左侧)。