Como modificar crosstab estatico a dinamico

From: Miguel Angel Marquina <angelmarqui(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Como modificar crosstab estatico a dinamico
Date: 2014-02-14 23:58:18
Message-ID: CAB9RcqPv8HZMX5-NwedSa=DriBgwk07kpxFt-Mqkq+YTDxwUxw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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*

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message FRANCISCO JOSE PALAO VILLANUEVA 2014-02-15 09:46:17 Re: No conecta por odbc
Previous Message Jaime Casanova 2014-02-14 23:17:22 Re: Herramientas Gui tools de postgresql