【问题标题】:Select, group and sum results from database从数据库中选择、分组和汇总结果
【发布时间】:2010-12-06 02:11:22
【问题描述】:

我有一个数据库,其中包含一些我想总结的字段。但这不是大问题,我想按创建的月份对这些字段进行分组。 ActiveRecord 自动创建了一个名为“created_at”的字段。所以我的问题;如何按月对结果进行分组,然后对每个月的字段求和?

已更新代码

@hours = Hour.all(:conditions => "user_id = "+ @user.id.to_s, 
                  :group => "strftime('%m', created_at)",
                  :order => 'created_at DESC')

这是我现在拥有的代码。设法按月分组,但没有设法总结我需要总结的两个字段“分钟”和“工资”

【问题讨论】:

    标签: ruby-on-rails activerecord group-by


    【解决方案1】:

    您可以使用active record calculations 来执行此操作。一些示例代码可能是

    Model.sum(:column_name, :group => 'MONTH("created_at")')
    

    需要注意的是,MONTH 是特定于 mysql 的,因此如果您在 SQLite 数据库上进行开发,这将无法正常工作。

    【讨论】:

    • 请参阅第一篇文章中的编辑以获取我目前拥有的代码。做了你写的事情。
    【解决方案2】:

    我不知道您是否使用了 SQL 查询来执行此操作(无需更改您当前的表结构)。但是,您只需几行代码即可。

    records = Tasks.find(:conditions => {..})
    month_groups = records.group_by{|r| r.created_at.month}
    month_groups.each do |month, records|
      sum stuff.. blah blah blah..
    end
    

    我在这个问题的右侧看到了这个链接。我假设其他数据库,除了 MySQL 也有类似的功能。

    mysql select sum group by date

    【讨论】:

      【解决方案3】:

      通过使用 :select 在获取查询时修复它,手动输入选择

      @hours = Hour.all(:conditions => "user_id = "+ @user.id.to_s,
                        :select => "created_at, SUM(time) time",
                        :group => "strftime('%m', created_at)",
                        :order => 'created_at DESC')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多