我正在尝试.sum来自以下查询的字段:
def self.busqueda_general(params)
query = select('venta.Id,venta.TOTAL')
.distinct
.joins('left outer join detallevet ON venta.Documento=detallevet.Docto and venta.RutaId=detallevet.RutaId')
.where("(venta.RutaId = :rutaId or :rutaId = '') AND (detallevet.Articulo = :articulo or :articulo = '') AND (venta.CodCliente = :codcliente or :codcliente = '') AND (venta.IdEmpresa = :idempresa)",{rutaId: params[:search], articulo: params[:search3], codcliente: params[:search2], idempresa: params[:search6]})
query = query.where('venta.Fecha >= ? AND venta.Fecha <= ?', (params[:search4].to_date.beginning_of_day).strftime('%Y-%m-%d %T'), (params[:search5].to_date.end_of_day).strftime('%Y-%m-%d %T')) if params[:search4].present? and params[:search5].present?
query
end
在控制器的方法中,我调用查询并将其求和如下:
@monto_total = Vent.busqueda_general(params).sum(:TOTAL)
但问题是查询显示的是由于.distinct而没有重复的记录,但是.sum正在累加所有记录,包括重复记录,忽略.distinct
答案 0 :(得分:0)
试试这个
@monto_total = Vent.busqueda_general(params).sum(:TOTAL).to_f
你可以使用to_s(转换成字符串)to_f - &gt; float,to_i - &gt;整数
答案 1 :(得分:0)
你有一个group by子句,所以你得到每个ID / Total组合的总和(总计)。
.group('venta.Id,venta.TOTAL')
对我来说,看起来你不需要这个group by子句。
UPDATE ::
query = where(Id: select('venta.Id')
.joins('left outer join detallevet ON venta.Documento=detallevet.Docto and venta.RutaId=detallevet.RutaId')
.where("(venta.RutaId = :rutaId or :rutaId = '') AND (detallevet.Articulo = :articulo or :articulo = '') AND (venta.CodCliente = :codcliente or :codcliente = '') AND (venta.IdEmpresa = :idempresa)",{rutaId: params[:search], articulo: params[:search3], codcliente: params[:search2], idempresa: params[:search6]}))
将主query
更改为此内容,保持其他所有内容相同。理想的方法是将join
detallevet
移至where
条款。