【问题标题】:sum total column of a table表格的总和列
【发布时间】:2021-12-31 17:23:27
【问题描述】:

我在 Rails 中有一个这样的查询:

  def self.nominas(params)
    query = select("payroll_employees.*,payroll_employees.total, concat(e.name, ' ', e.surname, ' ', e.other_surname) as nombre_empleado, ec.code as contrato, CASE WHEN payroll_employees.is_wage_integral = TRUE THEN 'Si' WHEN payroll_employees.is_wage_integral = FALSE THEN 'No' END AS salario_es_integral, pc.integral_wage AS p_c_integral_wage")
    query = query.joins("inner join payrolls p on (p.id = payroll_employees.payroll_id) inner join employee_contracts ec on (ec.id = payroll_employees.employee_contract_id) inner join employees e on (e.id = ec.employee_id) inner join payroll_companies pc on (pc.company_id = p.company_id) ")
    query = query.where('p.id = :nomina', {nomina: params[:id] })
    query = query.group(:id, 'e.name', 'e.surname', 'e.other_surname', 'ec.code', 'pc.integral_wage')
    query = query.having("(lower(concat(e.name, ' ', e.surname, ' ', e.other_surname)) LIKE :campo_busqueda or :campo_busqueda = '') OR (lower(ec.code) LIKE :campo_busqueda or :campo_busqueda = '')", {campo_busqueda: "%#{params[:buscador].try(:downcase)}%"})
    query = query.order('nombre_empleado')
  end

其中我有一列“total”,我需要对查询带给我的所有记录的“total”列求和,我的问题出现在这样做的时候:

@payroll_employees = PayrollEmployee.nominas(params)####
@sum_total = @payroll_employees.sum(:total) 

它给我带来了这样的东西:

{[345, "Angel", "BONILLA", "MONTAÑO", "2010", true]=>0.106215575500000000000001e7, [079, "Bill f", "CABRERA", "RICO", "1846", true]=>0.1330346e7, ...

在我看来,这是因为我的查询有一个组。是否可以求和并得到一个数字而不是一组总数?

【问题讨论】:

  • 我在查询中看不到总列。你能更新你的查询吗
  • 您已经发现结果是分组的,因为您的查询中有一个 GROUP BY 子句。如果您想获得所有记录的总和,则必须删除该分组。
  • @AniketShivamTiwari 谢谢回复,我已经更新了
  • @spickermann 感谢您的回复,这是我的问题,我如何计算总数?
  • 正如我已经写过的,只需从该查询中删除这一行 query = query.group(:id, 'e.name', ...

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

尝试对总和使用求和函数(payroll_employees.total)

  def self.nominas(params)
    query = select("payroll_employees.*,sum(payroll_employees.total) as total, concat(e.name, ' ', e.surname, ' ', e.other_surname) as nombre_empleado, ec.code as contrato, CASE WHEN payroll_employees.is_wage_integral = TRUE THEN 'Si' WHEN payroll_employees.is_wage_integral = FALSE THEN 'No' END AS salario_es_integral, pc.integral_wage AS p_c_integral_wage")
    query = query.joins("inner join payrolls p on (p.id = payroll_employees.payroll_id) inner join employee_contracts ec on (ec.id = payroll_employees.employee_contract_id) inner join employees e on (e.id = ec.employee_id) inner join payroll_companies pc on (pc.company_id = p.company_id) ")
    query = query.where('p.id = :nomina', {nomina: params[:id] })
    query = query.group(:id, 'e.name', 'e.surname', 'e.other_surname', 'ec.code', 'pc.integral_wage')
    query = query.having("(lower(concat(e.name, ' ', e.surname, ' ', e.other_surname)) LIKE :campo_busqueda or :campo_busqueda = '') OR (lower(ec.code) LIKE :campo_busqueda or :campo_busqueda = '')", {campo_busqueda: "%#{params[:buscador].try(:downcase)}%"})
    query = query.order('nombre_empleado')
  end

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多