Skip site navigation (1) Skip section navigation (2)

Re: RV: Consulta SQL algo compleja

From: Lynkx <lynkx(at)surnet(dot)cl>
To: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: RV: Consulta SQL algo compleja
Date: 2004-12-16 09:47:02
Message-ID: 41C15996.5010606@surnet.cl (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Hola.

Necesto agregarle una nueva complejidad.

Sucede que las facturas pueden ser nulas (y necesariamente almacenadas), 
por lo tanto le agrego un nuevo campo: nulo, que es de tipo char que 
guarda un 'S' o 'N' segun corresponda.
La tabla facturas queda asi:
facturas:
- num_fact
- cod_sucursal
- valor
- nulo

La logica de mi sistema al anular una factura, elimina todas las 
notas_credito asociadas y actualiza el campo nulo a 'S'.

Como se deja entrever, solo las factursa con nulo = 'N' son las que 
importan para generar el sum_valor. Despues de tratar con muchas 
sentencias, esta fue la que me resulto:

SELECT
   s.cod_sucursal, s.nombre,
   COALESCE((SUM(f.valor) - COALESCE(SUM(n.valor), 0)), 0)/(SELECT 
COUNT(*) FROM sucursales) AS sum_valor
 FROM sucursales s LEFT JOIN    (facturas f
                    LEFT JOIN notas_credito n ON (f.num_fact = 
n.num_fact AND f.cod_sucursal = n.cod_sucursal)
                    INNER JOIN sucursales ON (f.nulo = 'N')
                )
            ON (s.cod_sucursal = f.cod_sucursal)
 GROUP BY
   s.cod_sucursal, s.nombre

que devuelve:
1 matriz 75
2 sede 0
3 sede2 0
(esto esta correcto como respuesta, pero la consulta esta poco elegante 
a mi parecer)

Como se ve, necesito decir en alguna parte que solo las facturas con 
nulo = 'N' son las que se toman en cuenta con un INNER JOIN, pero no se 
como hacerlo para no agregar otra tabla (notese  que va sucursales, pero 
que no importa para nada) y el arreglin que hago luego es dividir el 
resultado por el numero de sucursales. Si colocaba una restriccion en  
WHERE despues de FROM con f.nulo = 'N', no aparecia la sede2 con valor 
cero (0)

La pregunta es: ¿Existe una forma mas elegante de agregar esa restriccion?

Saludos


PD: Datos iniciales del problema mas los datos con facturas nulas
   Poseo las sgtes tablas (simplificado para solo mostrar el problema en 
si):

facturas
- num_fact (PK)
- cod_sucursal (FK con sucursales)
- valor
- nulo (¡¡¡ojo: nuevo  campo!!!)

notas_credito
- num_nc (PK)
- cod_sucursal (FK con sucursales)
- num_fact (FK con facturas)
- valor

sucursales
- cod_sucursal (PK)
- nombre

Y deseo mostrar, para cada sucursal, la suma de facturas.valor menos la 
suma de notas_credito.valor.
Contar que una factura puede tener cero o mas notas_credito (se que hay 
una redundancia al tener cod_sucursal tambien en notas_credito, pero 
bueno asi venia el modelo)

Ingreso los sgtes datos:
sucursales:
1, 'matriz'
2, 'sede'
3, 'sede2'

facturas:
1, 1, 100, 'N'
2, 2, 200, 'S'
3, 1, 50, 'S'

notas_credito:
1, 1, 1, 25

Alvaro Herrera wrote:

>On Wed, Dec 15, 2004 at 11:13:47AM +0000, Lynkx wrote:
>
>Hola,
>
>  
>
>>Intente con lo que me dijiste y con lo sgte:
>>
>>SELECT
>>  s.cod_sucursal, s.nombre,
>>  (SUM(f.valor) - COALESCE(SUM(n.valor), 0)) AS sum_valor
>>FROM sucursales s LEFT JOIN (facturas f LEFT JOIN
>>   notas_credito n USING (num_fact, cod_sucursal)) USING (cod_sucursal)
>>GROUP BY
>>  s.cod_sucursal, s.nombre
>>
>>Pero me sigue devolviendo null en las sucursales que no tengan ninguna 
>>factura aun.
>>    
>>
>
>Ah, ya entiendo el problema ... entonces aplica coalesce a sum_valor:
>
> SELECT
>   s.cod_sucursal, s.nombre,
>   COALESCE((SUM(f.valor) - COALESCE(SUM(n.valor), 0)), 0) AS sum_valor
> FROM sucursales s LEFT JOIN (facturas f LEFT JOIN
>    notas_credito n USING (num_fact, cod_sucursal)) USING (cod_sucursal)
> GROUP BY
>   s.cod_sucursal, s.nombre
>
>  
>

In response to

pgsql-es-ayuda by date

Next:From: JaimeDate: 2004-12-16 12:32:30
Subject: Re: Consultas varias
Previous:From: Jaime CasanovaDate: 2004-12-16 07:42:20
Subject: Acentos en postgres

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group