2009-10-12 37 views
5

Tôi có một cơ sở dữ liệu với một số trường tôi muốn tính tổng. Nhưng đó không phải là vấn đề lớn, tôi muốn nhóm những lĩnh vực đó theo tháng chúng được tạo ra. ActiveRecord automaticaly đã tạo một trường có tên "created_at". Vì vậy, câu hỏi của tôi; làm thế nào tôi có thể nhóm kết quả theo tháng, sau đó tổng hợp các trường cho mỗi tháng?Chọn, nhóm và tổng kết quả từ cơ sở dữ liệu

cập nhật với mã

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

Đây là mã tôi có bây giờ. Được quản lý để nhóm theo tháng, nhưng không quản lý tổng hợp hai trường của tôi, "phút" và "tiền lương" mà tôi cần phải cộng số

Trả lời

1

cố định nó bằng cách sử dụng: chọn khi nhận được truy vấn, inputing Selects tay

@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') 
1

Tôi không biết liệu có truy vấn SQL bạn sử dụng để thực hiện hay không (mà không thay đổi cấu trúc bảng hiện tại của bạn). Tuy nhiên, bạn làm điều đó với một số dòng mã.

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 

Tôi thấy liên kết này ở bên phải của câu hỏi này. Tôi giả định các cơ sở dữ liệu khác, bên cạnh MySQL có các chức năng tương tự.

mysql select sum group by date

2

Bạn có thể sử dụng active record calculations để làm điều này. Một số mã ví dụ có thể là

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

Rõ ràng với báo trước MONTH là mysql cụ thể, vì vậy nếu bạn đang phát triển trên cơ sở dữ liệu SQLite, điều này sẽ không hoạt động.

+0

thấy chỉnh sửa trong bài viết đầu tiên cho đoạn code tôi có vào lúc này. Đã làm một cái gì đó như bạn đã viết. – ThoKra

+0

Cập nhật liên kết: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html – Meekohi

Các vấn đề liên quan