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 09:27:57
Message-ID: 41BEB21D.8080508@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Leo Gamez CCD Desarrollo 2004-12-14 09:46:08 RV: Consulta SQL algo compleja
Previous Message Jaime Casanova 2004-12-13 22:41:56 Re: Consulta SQL algo compleja