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*

Responder a