Hola Esneiker, trata de utilizar clausula "WITH", te puede ayudar mucho a optimizar mejor ese tipo de consultas donde tienes subconsultas en en el SELECT.
http://www.postgresql.org/docs/9.4/interactive/queries-with.html
Saludos

El 08-06-2015 a las 9:20, Esneiker Enriquez Cabrera escribió:

Saludos a todos los amigos de la comunidad.

Les escribo porque tengo un problema y no logro encontrar una buena forma de resolverlo. Tengo una función para obtener reportes estadísticos donde debo retornar el nombre de las unidades organizativas, los nombres de los tipos de servicios y los totales, de la siguiente forma:

Unidad

        

Tipo de servicio

        

T1

        

T2

        

T3

        

T4

        

        

        

        

        

El problema es que entre la tabla de unidades organizativas y tipos de servicio no hay relación directa, sino a través de otras tablas del negocio. Necesito tirar todas las unidades contra todos los tipos de servicio.

La solución que he dado hasta el momento es con un ciclo for recorrer la tabla tipo de servicio e ir calculando los totales e irlos insertando en una tabla temporal para al final devolver los valores, donde evidentemente esto provoca problemas de rendimiento, el código es el siguiente(cortado para no abrumar):

for aid_elemento,adescripcion from vw_nmtipo_servicio order by tipo_servicio loop

    SQLText = 'INSERT INTO estadistico SELECT id, nombre,

(SELECT COUNT(distinct vw_registro_expediente_incidencia.id) FROM vw_registro_expediente_incidencia WHERE ...) AS t1,

(SELECT COUNT(distinct vw_registro_expediente_incidencia.id) FROM vw_registro_expediente_incidencia ...) AS t2,

(SELECT COUNT(distinct vw_registro_expediente_incidencia.id) FROM vw_registro_expediente_incidencia ...) AS t3,

(SELECT COUNT(distinct vw_registro_expediente_incidencia.id) FROM vw_registro_expediente_incidencia ...) AS t4

'''||adescripcion_elemento||'''::character varying as criterio1 FROM nmunidad_org WHERE (nmunidad_org.id IN ('||alista_id_nivel||'))';

    execute SQLText;

    SQLText = '';

   end loop;

Espero que me puedan dar alguna recomendación para optimizar el diseño.

Saludos,

*/M.Sc. Esneiker Enriquez Cabrera/**
**Esp. B en Ciencias Informáticas*

Desoft en Ciego de Ávila. Joaquín de Agueroesq. Calle 2. Ciego de Ávila. Cuba. *Telf.:* 53 33 22 8971, *email.:* eenriq...@cav.desoft.cu <mailto:eenriq...@cav.desoft.cu>



__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 11728 (20150603) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Responder a