【问题标题】:How to sum columns and group by date column in Rails如何在 Rails 中对列求和并按日期列分组
【发布时间】:2015-07-23 10:06:15
【问题描述】:

我有一个带有以下列的模型

收费模式

Date
fee
discount

数据

1/1/15, 1, 1
1/1/15, 2, 1
2/2/15, 3, 3

我有一些命名范围,例如 this_year

我想做类似 Charges.this_year.summed_up 之类的事情

如何为此创建一个命名范围。

那么返回的响应应该是:

1/1/15, 3, 2
2/2/15, 3, 3

【问题讨论】:

标签: ruby-on-rails activerecord named-scope


【解决方案1】:

假设您有一个带有日期字段(例如,published_at)和 2 个整数字段(例如,费用、折扣)的模型。您可以使用“group”方法在 published_at 上运行 GROUP BY。如果您只想要一个字段的总和,则只需使用 sum 方法。如果您需要多个字段,则必须在内部运行带有 SQL SUM 的选择,以获取多列总和。这是一个例子。

Charge..group(published_at)
.select("published_at, SUM(fee) AS sum_fee, SUM(discount) AS sum_discount")
.order("published_at")

注意:汇总字段不会显示在 rails 控制台返回值提示中。但它们是供你使用的。

【讨论】:

  • 我正在处理类似的行,当直接在数据库上执行时,生成的 sql 会显示汇总列,但我无法以任何方式访问它。你能更新你的答案吗?
【解决方案2】:

根据您想要的最终结果,您可能希望查看.group(:attribute) 而不是.group_by

Charge.group(:date).each do |charge|
     charge.where('date = ?', charge.date).sum(:fee)
     charge.where('date = ?', charge.date).sum(:discount)
end

我发现这种方法更容易,尤其是在为要从表中提取的数据设置多个条件时。

无论如何,我有一个会计模型会出现这种问题,我需要在一张表上提供信用卡和借记卡以及付款信息类型,我花了几个小时学习group_by,然后才意识到@987654325 @ 提供了一个简单的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多