1

我想要做的是加入表格并总结 3 列。

   self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").select("sum(a), sum(b), sum(c)")

给我

#<ActiveRecord::Relation [#<DocumentProduct id: nil>]>

类似的东西有效:

   self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").sum("a")

但我想要3个总和。我不能求和(“a,b,c”)。问题出在哪里?

4

1 回答 1

2

因此,代码使用 ActiveRecord 链式方法语法构建 SQL 查询。可以.to_sql用作大多数此类链的最后一部分(基本上,只要它仍然是一个 ActiveRecord 对象,而不是被转换为一个数组,例如)来查看生成的 SQL,或者确实检查日志,如果它是上。考虑到链的共同部分:

self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id")

这会产生类似的东西(可能不准确,因为我对您的应用程序有点猜测):

SELECT "document_products".* FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

您列出的两种最终方法非常不同;select选择要返回查询中的哪些列,而sum是一个聚合函数,它期望在每种​​情况下都返回一个值。考虑到select,我们得到如下生成的内容:

SELECT SUM(products.a), SUM(products.b), SUM(products.c) FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

解释此查询时,无法找到预期的数据,从而导致所描述的问题。但是,确保该GROUP BY子句包含在SELECT零件中会产生必要的信息。尝试这样的事情:

self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").select("products.tax_id, sum(a), sum(b), sum(c)")

这会生成类似于以下的 SQL:

SELECT products.tax_id, SUM(products.a), SUM(products.b), SUM(products.c) FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

这似乎返回了必要的信息,我认为,这就是你正在寻找的(或接近它)。

于 2013-08-18T13:10:00.547 回答