Re: RV: Consulta SQL algo compleja

From: Lynkx <lynkx(at)surnet(dot)cl>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: RV: Consulta SQL algo compleja
Date: 2004-12-14 11:04:29
Message-ID: 41BEC8BD.2020705@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Una ultima consulta.

Si agrego una nueva sucursal, por ejemplo, sede2, al ejecutar la
consulta no aparece con sum_valor igual a cero. O sea, la idea es mas o
menos esto:
1 matriz 125
2 sede 200
3 sede2 0 <--- En el caso q todavia no tenga ninguna factura asociada

Se que no es muy critica la consulta, ya q si no se puede voy a dejar
asi nada mas la consulta.

Salu2.

Lynkx wrote:

> Hola Leo y Jaime.
> Me ha sido de mucha ayuda el metodo coalesce, he resuelto mi problema
> con lo sgte.:
>
> SELECT
> s.cod_sucursal, s.nombre,
> (SUM(f.valor) - COALESCE(SUM(n.valor), 0)) AS sum_valor
>
> FROM facturas f LEFT JOIN notas_credito n ON (f.num_fact = n.num_fact
> AND f.cod_sucursal = n.cod_sucursal), sucursales s
>
> WHERE f.cod_sucursal = s.cod_sucursal
>
> GROUP BY
> s.cod_sucursal, s.nombre
>
> Muchas gracias por su tiempo.
>
> Saludos.
>
> Leo Gamez CCD Desarrollo wrote:
>
>> Hola,
>>
>> Creo que existe una funcion en postgres para detectar un valor nulo,
>> es coalesce(). Tambien funciona en mysql. Adjunto su explicacion de
>> la documentacion online. Buen provecho.
>>
>> http://www.postgresql.org/docs/7.4/static/functions-conditional.html
>>
>> 9.12.2. COALESCE
>>
>> COALESCE(value [, ...])
>>
>> The COALESCE function returns the first of its arguments that is not
>> null. Null is returned only if all arguments are null. This is often
>> useful to substitute a default value for null values when data is
>> retrieved for display, for example:
>>
>> SELECT COALESCE(description, short_description, '(none)') ...
>>
>> Like a CASE expression, COALESCE will not evaluate arguments that are
>> not needed to determine the result; that is, arguments to the right
>> of the first non-null argument are not evaluated.
>> ------------------------------------------------------
>>
>> Saludos,
>>
>> Leo
>>
>> PD: Quiza alguien se ofenda porque puedo no pertenecer a la lista de
>> correo. Tuve problemas cuando me suscribi, pero desde que Alvaro
>> Herrera me hecho una mano para arreglarlo, no he vuelto a comprobar
>> mi status. Sirva este correo para comprobarlo.
>>
>> ________________________________
>>
>> De: pgsql-es-ayuda-owner(at)postgresql(dot)org en nombre de Jaime Casanova
>> Enviado el: lun 13/12/2004 23:41
>> Para: pgsql-es-ayuda(at)postgresql(dot)org
>> Asunto: Re: [pgsql-es-ayuda] Consulta SQL algo compleja
>>
>>
>>
>> --- Lynkx <lynkx(at)surnet(dot)cl> escribió:
>>
>>
>>
>>> SELECT DISTINCT
>>> s.cod_sucursal, s.nombre,
>>> (SUM(f.valor) - SUM(n.valor)) AS sum_valor
>>>
>>> FROM facturas f LEFT JOIN notas_credito n ON
>>> (f.num_fact = n.num_fact
>>> AND f.cod_sucursal = n.cod_sucursal), sucursales s
>>>
>>> WHERE f.cod_sucursal = s.cod_sucursal
>>>
>>> GROUP BY
>>> s.cod_sucursal, s.nombre
>>>
>>> Y devuelve lo sgte:
>>> 1 matriz 125
>>> 2 sede (no hay valor)
>>>
>>>
>>
>>
>> 1) No se para que usas el distinct, de todas formas ya
>> estas haciendo un group by y el efecto va a ser el
>> mismo. NO se si postgres sea lo suficientemente pilas
>> para saber que eso esta de mas en todo caso sacalo.
>>
>> 2) Ahora tu problema, el segundo sum (el de la
>> sucursal 2) retorna null por que no hay notas de
>> credito en esa sucursal y cualquier valor sumado,
>> restado, multiplicado, dividido, etc, etc por null se
>> hace NULL!!
>>
>> Solucion: en informix y en oracle hay una funcion
>> llamada nvl que se usaba para estos casos. dicha
>> funcion no existe en postgres y no se que mecanismo
>> han puesto para reemplazarla yo escribi una funcion
>> nvl para mi aqui te doy el codigo
>>
>> CREATE OR REPLACE FUNCTION "public"."nvl" (numeric,
>> numeric) RETURNS numeric AS'
>> select case when $1 is null then $2 else $1
>> end;
>> 'LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY
>> INVOKER;
>>
>> y tu select quedaria + o - asi:
>>
>> SELECT s.cod_sucursal, s.nombre, (SUM(f.valor) -
>> nvl(SUM(n.valor)), 0) AS sum_valor
>> FROM facturas f LEFT JOIN notas_credito n
>> ON (f.num_fact = n.num_fact AND
>> f.cod_sucursal = n.cod_sucursal),
>> sucursales s
>> WHERE f.cod_sucursal = s.cod_sucursal
>> GROUP BY s.cod_sucursal, s.nombre
>>
>>
>> Atentamente,
>> Jaime Casanova
>>
>> _________________________________________________________
>> Do You Yahoo!?
>> Información de Estados Unidos y América Latina, en Yahoo! Noticias.
>> Visítanos en http://noticias.espanol.yahoo.com
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
>>
>> http://archives.postgresql.org/pgsql-es-ayuda
>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
>>
>>
>>
>>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
>
> http://archives.postgresql.org/pgsql-es-ayuda
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Cristofer Nicolas Reyes Aguilera 2004-12-14 13:01:22 Re: Acentos en postgres
Previous Message Leo Gamez CCD Desarrollo 2004-12-14 09:46:08 RV: Consulta SQL algo compleja