Выбрать, сгруппировать и суммировать результаты из базы данных

У меня есть база данных с некоторыми полями, которые я хотел бы суммировать. Но это не большая проблема, я хочу сгруппировать эти поля по месяцам, по которым они были созданы. ActiveRecord автоматически создает поле с именем created_at. Итак, мой вопрос; как я могу сгруппировать результат по месяцам, а затем суммировать поля за каждый месяц?

Обновлено с помощью кода

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

Это код, который у меня есть сейчас. Удалось сгруппировать по месяцам, но мне не удалось суммировать два моих поля, «минуты» и «зарплата», которые мне нужно суммировать


person ThoKra    schedule 12.10.2009    source источник


Ответы (3)


Для этого можно использовать активные вычисления записей. Некоторый пример кода может быть

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

Очевидно, с оговоркой, что МЕСЯЦ зависит от mysql, поэтому, если вы разрабатываете базу данных SQLite, это не сработает.

person timmow    schedule 12.10.2009
comment
см. редактирование в первом сообщении для кода, который у меня есть в настоящее время. Сделал что-то вроде того, что вы написали. - person ThoKra; 13.10.2009

Я не знаю, есть ли у вас 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 выберите группу суммы по дате

person Jim    schedule 12.10.2009

Исправлено с помощью: выберите при получении запроса, ввод выбирает вручную

@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')
person ThoKra    schedule 13.10.2009