create or replace function ranking_ventas( in starts date, in ends date, out descripcion varchar, out marca varchar, out contenido varchar, out unidad varchar, out amount double precision, out sold_amount double precision, out costo double precision, out contrib double precision ) returns setof record as $$ declare q text; l record; begin q := $S$ SELECT producto.descripcion as descripcion, producto.marca as marca, producto.contenido as contenido, producto.unidad as unidad, SUM (venta_detalle.cantidad) as amount, SUM (((venta_detalle.cantidad*venta_detalle.precio)-(venta.descuento*((venta_detalle.cantidad*venta_detalle.precio)/(venta.monto+venta.descuento))))/*-(venta_detalle.iva+venta_detalle.otros)::integer*/) as sold_amount, SUM ((venta_detalle.cantidad*venta_detalle.fifo)::integer) as costo, SUM (((venta_detalle.precio*cantidad)-((iva+venta_detalle.otros)+(fifo*cantidad)))::integer) as contrib FROM venta, venta_detalle inner join producto on venta_detalle.barcode = producto.barcode where venta_detalle.id_venta=venta.id and fecha>=$S$ || quote_literal(starts) || $S$ AND fecha< $S$ || quote_literal(ends) || $S$ AND venta.id NOT IN (SELECT id_sale FROM venta_anulada) GROUP BY 1,2,3,4 $S$; for l in execute q loop descripcion := l.descripcion; marca := l.marca; contenido := l.contenido; unidad := l.unidad; amount := l.amount; sold_amount := l.sold_amount; costo := l.costo; contrib := l.contrib; return next; end loop; return; end; $$ language plpgsql;