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
>
>
>
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 |