Hola.

Te paso un query recursivo para que veas si te sirve.

with cte_grupos as (

    with recursive rec_grupo (grupo, intermedio, sub) as -- obtener todos
los subgrupos de un grupo
    (
        select distinct grupo, grupo, grupo from pruebas -- Incluir al
mismo grupo como subgrupo
        union all
        select grupo, grupo, cuenta from pruebas -- Incluir los grupos
iniciales definidos como tales (clase = 'G')
        where clase = 'G'
        union all
        select rg.grupo, p.grupo, p.cuenta -- Recorrer recursivamente los
subgrupos basado en el campo cuenta de los grupos
        from pruebas p
        join rec_grupo rg on (p.grupo = rg.sub)
        where p.clase = 'G'
    )

    select distinct grupo, sub from rec_grupo -- Eliminar duplicados
)
select g.grupo, sum (case when signo = '-' then importe * -1 else importe
end) total -- Acumular los importes de los registros de clase 'C'
from cte_grupos g
join pruebas p on g.sub = p.grupo
where p.clase = 'C'
group by g.grupo
order by g.grupo


    grupo     | total
--------------+-------
 01           |   200
 02           |   250
 03           |   249
 04           |   249
 05           |  1249
(5 rows)





Una cosa no me queda claro...
Que significa el '-' en los registros de tipo 'G' ?
Dependiendo de tu respuesta quizas se deba hacer una modificación.
Otro aspecto a considerar es el desempeño del query cuando hay muchos
registros. Otras personas en esta lista te podrán aconsejar mejor en ese
ambito

Saludos,
Walter



2016-10-20 15:59 GMT-03:00 Kernel <jucab...@gmail.com>:

> El 20/10/2016 a las 19:47, Alvaro Herrera escribió:
>
>> Kernel escribió:
>>
>>>
>>> Hola,
>>> no se si postgres permite una consultas recursivas.
>>>
>>
>>    WITH RECURSIVE
>> https://www.postgresql.org/docs/9.5/static/sql-select.html#AEN86770
>>
>> No tengo tiempo de construir una consulta a partir de tu ejemplo ahora,
>> pero sí se puede.
>>
>>
> Ok, voy a ver si entiendo como funciona , de todas formas si alguien tiene
> un ejemplo sencillo le estaría muy agradecido ...
>
> Gracias
>
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>

Responder a