无法计算均值,排除sqlite3中.each块中的当前观察值

时间:2019-04-10 23:43:22

标签: ruby sqlite each mean

我有以下方法。我的代码在我的if statement块中的.each处遇到了错误:nil can't be coerced into Float (TypeError)

我尝试了许多变体,所有变体都位于.each块中。

该代码应计算平均所有项,按Type分组,不包括当前观测值。例如,Type foo下有10个具有10个不同值的项目。项目1的单元格计算9个项目的平均值-不包括本身。请指教。我机智的结束了。

下面的代码是我的IDE中现有的方法。 Ruby 2.3.7

specific_row[0]应该属于Id,并且 specific_row[1]应该属于Amount注意:我已选择使用.execute而不是.execute2来避免头数据跳闸。

def billavgx(info_hash)
    begin
        db = SQLite3::Database.open('billinfo.db')
        db.results_as_hash = true
        db.transaction
        specific_amt =  db.prepare "SELECT Amount AND Id FROM bills WHERE Type = :Type" 
        specific_amt.execute info_hash[:category]
        specific_amt.each do |specific_row|
            if @total_rows == 1
                @avgx = (@total_amt - specific_row[1]) / @total_rows
            elsif @total_rows > 1
                @avgx = (@total_amt - specific_row[1]) / (@total_rows - 1)
            else
                return "insufficient entries"
            end         
            db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Id = :Id AND Type = :Type", @avgx, specific_row[0], info_hash[:category]
            end
        puts db.changes.to_s + " changes made"
        db.commit
    rescue SQLite3::Exception => e
        puts "error here " , e
    ensure
        specific_amt.close if specific_amt
        db.close if db
    end
end

1 个答案:

答案 0 :(得分:0)

上述.each块的一个主要问题是使用instance variable。将@avgx换为local variable avgx可解决此问题。然后可以在SQL avgx语句中使用UPDATE

第二specific_row array需要指定正确的值。在这种情况下,所需值为Amount。因为arrays的索引为0,所以Amount的值存储在“ specific_row [0]”中。

        specific_amt.each do |specific_row|
            if @total_rows == 1
                avgx = @total_amt / @total_rows
            elsif @total_rows > 1
                avgx = (@total_amt - specific_row[0]) / (@total_rows - 1)
            else
                puts "insufficient entries"
                return "insufficient entries"
            end 
        db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Amount = :Amount AND Type = :Type AND Year = :Year", avgx, specific_row[0], info_hash[:category], info_hash[:year]
        end