Buenas tardes amigos de la comunidad postgres: Tengo una duda y es como puedo hacer para modificar mi consulta , uso un crosstab para generar mi reporte de contrato y sus servicios adquiridos , necesito que la parte de categorias sea dinĂ¡mico eso quiere decir que a medida que ingreso una nueva categoria en mi tabla servicio se vea reflejada en mi RETURN de la funcion . les envio mi script y agradesco la ayuda.
CREATE OR REPLACE FUNCTION logistica.spu_abonadoservicio_sel( IN p_con_id integer DEFAULT 0 , IN p_ordenadopor text DEFAULT ''::text , IN p_limitefilas integer DEFAULT 0 , IN p_desdequefila integer DEFAULT (-1) ) RETURNS TABLE( abo_id integer , con_id integer , abo_codigo character varying , abo_cobertura integer , _llp integer , _gps integer , _gra integer , _rbk integer , _apmtp850s integer , _apmtp850 integer , _ammtm800 integer , _ammtm5400 integer , _aba integer , _aca integer , _spmtp850s integer , _spmtp850 integer , _smmtm800 integer , _smmtm5400 integer ) AS $BODY$ DECLARE v_sql text = ''; v_select text = ''; v_and text = ''; v_where text = ''; v_order text = ''; v_limit text = ''; BEGIN IF (p_con_id > 0) THEN v_where := ' t.con_id = '|| p_con_id; END IF; v_select := 'select * from crosstab ( '' SELECT t.abo_id, t.con_id, t.abo_codigo, t.abo_cobertura , ( SELECT COUNT(*) FROM logistica.abonadoservicio as j2 WHERE t.abo_id=j2.abo_id and j2.ser_id=j1.ser_id ) as cantidad FROM logistica.abonado as t CROSS JOIN logistica.servicio as j1 WHERE j1.set_isi = true ' ||CASE WHEN CHAR_LENGTH(TRIM(v_where))>0 THEN ' AND ' ELSE '' END|| v_where ||' '', '' *select ser_id from logistica.servicio where set_isi = true order by ser_order * '' ) as newtable ( abo_id integer, con_id integer, abo_codigo character varying(250), abo_cobertura integer, _LLP integer, _GPS integer, _GRA integer, _RBK integer, _APMTP850S integer, _APMTP850 integer, _AMMTM800 integer, _AMMTM5400 integer, _ABA integer, _ACA integer, _SPMTP850S integer, _SPMTP850 integer, _SMMTM800 integer, _SMMTM5400 integer );'; -- ORDER BY IF (CHAR_LENGTH(TRIM(p_ordenadopor)) > 0) THEN v_order := ' ORDER BY ' || p_ordenadopor; END IF; IF ( p_limitefilas > 0 AND p_desdequefila >= 0 ) THEN v_limit := ' LIMIT ' || p_limitefilas || ' OFFSET ' || p_desdequefila; END IF; v_sql := v_select || v_order || v_limit; RAISE NOTICE 'Query: %', v_sql; RETURN QUERY EXECUTE v_sql; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; -- *Atte. * Ing. Miguel Angel Marquina *rpc: **987 - 585052* *claro: **955 - 786887* *nexteL:600 * 2100*