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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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