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

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

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