Duda con Isnull en SUM

04/11/2007 - 18:06 por Alexis | Informe spam
Solicito su ayuda para esto:

Tengo dos tablas
a) registros de compras
compras (numcompra, valor, fecha)

b)registros de pagos de esas compras
pagos (numcompra, numpago, valor)

Es una relacion opcional de 1 a N por Numcompra y quiero obtener los
balances de cada compra:

Numcompra, Comprado, Pagado

Tengo el siguiente select:

select numcompra, comprado=compras.valor, pagado=sum(pagos.valor)
from compras
left join pagos on compras.numcompra=pagos.numcompra
group by numcompra,compras.valor

Dado que es un Left Join, la pregunta es como debo usar ISNULL para que la
columna "Pagado" me de Cero cuando la compra no tenga ningun pago:

asi: ISNULL(sum(pagos.valor),0)
o asi: sum( ISNULL(pagos.valor,0) )
o asi: ISNULL(sum( ISNULL(pagos.valor,0) ), 0)
?


Gracias

Preguntas similare

Leer las respuestas

#21 Carlos M. Calvelo
10/11/2007 - 14:53 | Informe spam
Hola Jorge,

On 10 nov, 03:07, jeastman wrote:
Mostrar la cita
No nos estamos entendiendo.
Claro que puede dar resultados diferentes. Eso no hace falta
discutirlo.

Para mi el tema es todavía el siguiente:
Tu le dices a Alexis que el sum(isnull(...,0)) es necesario.
Y yo digo que no, que se puede evitar como ya he explicado.
Y que si se puede evitar, se debería evitar porque es preferible
hacer solo un isnull sobre el resultado de una suma a hacer un
isnull() para todos y cada uno de los sumandos, que pueden ser
muchísimos.

Entonces la única discusión que me parece vale la pena
es que alguien ponga un ejemplo, a poder ser lo mas
sencillo posible, del que el/ella piense que no se puede
expresar en términos de isnull(sum(...),0) demostrando
así que el sum(isnull(...,0)) es necesario.

Saludos,
Carlos
#22 Carlos M. Calvelo
10/11/2007 - 14:57 | Informe spam
Hola Jorge,

On 10 nov, 03:13, jeastman wrote:
Mostrar la cita
Vamos a ver Jorge, repito que me parece que no nos estamos
entendiendo.
La discusión empieza con esta respuesta tuya a Alexis:

Mostrar la cita
Mi respuesta a esa afiramación tuya es que no es
así. Este es el tema de que se esta tratando.

Repito aquí:
sum(...) solo da null si no hay sumandos o si todos los
sumandos son null.

Bien. Si queremos interpretar el resultado null de un sum()
como 0, el isnull(sum(...),0) cubre los dos casos anteriores.
Si hay mas de cero sumandos y al menos uno de ellos no es
null, el sum(...) no dará null.


Vease también esta incongruencia:

Select 1+2+null

Resultado: null

select sum(col)
from (select 1 as col
union
select 2
union
select null) Tab

Resultado: 3

Mostrar la cita
Ya he mirado tus consultas y los resultados tienen una explicación.
Esos resultados solo dicen que si haces cosas de formas distintas
puedes tener resultados distintos. Pero no demuestra para nada que
se necesita el sum(isnull(...,0)) para evitar que una suma dé null
porque hay sumandos con valor null. Y de esto se trata.


Mostrar la cita
Pero Jorge... es un ejemplo de qué?

Mostrar la cita
Saludos,
Carlos
#23 Carlos M. Calvelo
10/11/2007 - 15:08 | Informe spam
Hola Jorge,

On 10 nov, 03:20, jeastman wrote:
Mostrar la cita
Los resultados que pones ya lo he probado, pero ya que insistes.

Estos son los resutados de las tres últimas consultas de tu ejemplo.
Estas consultas solo se diferencian en el Select; desde el FROM
son completamente iguales. Entonces las resumo así en una
consulta:

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
sum( f.cantidad ) - d.cantidad as ventaEfectiva1,
sum( f.cantidad ) - isnull( d.cantidad, 0 ) as ventaEfectiva2,
isnull( sum( f.cantidad ) - d.cantidad, 0 ) as ventaEfectiva3,
isnull(sum(f.cantidad),0) - isnull(d.cantidad,0) as
nuevaVentaEfectiva

from inventario i left join facturaDetalle f on
f.codProducto = i.codProducto
left join ( select
d.codProducto,
sum( d.cantidad ) as cantidad
from devolucionVenta d
group by d.codProducto ) as d on
d.codProducto = i.codProducto
group by i.codProducto,
d.cantidad
order by 1

(la columna 'nuevaVentaEfectiva' la he añadido yo)

Resultado:
Prod canFact d.Cant vEff1 vEff2 vEff3 nuevaVEff.
1 16 3 13 13 13 13
2 12 1 11 11 11 11
3 5 NULL NULL 5 0 5
4 NULL NULL NULL NULL 0 0


Miremos la línea de codProducto 3:
3 5 NULL NULL 5 0 5

Antes de nada decir que supongo que estaremos de acuerdo en
que dadas las tablas que presentas el resultado en la columna
ventaEffectiva tiene que ser 5.

Para codProducto 3 no hay devoluciones y por lo tanto
d.cantidad (d.Cant) es null debido la left join.

vEff1:
sum( f.cantidad ) - d.cantidad 5 - null null

vEff2:
sum( f.cantidad ) - isnull( d.cantidad, 0 ) 5 - isnull(null,0) 5 - 0 5

vEff3:
isnull( sum( f.cantidad ) - d.cantidad, 0 ) isnull(5 - null, 0) isnull(null,0) 0

nuevaVEff:
isnull(sum(f.cantidad),0) - isnull(d.cantidad,0) isnull(5,0) - isnull(null,0) 5 - 0 5

Esta última columna la he añadido yo. El resultado es el mismo que
vEff2, pero vEff2 no tiene en cuenta que sum(f.cantidad) también
podía haber sido null.

Bien... ahora he analizado por qué los resultados son diferentes
para codProducto 3. Y ahora? Esto no añade nada a lo que
yo creo que se está tratando.

En general imagínate que tenemos las columnas
a.cantidad y b.cantidad, y que queremos la suma de
todos los a.cantidad - b.cantidad
Podemos hacer:
sum(isnull(a.cantidad,0) - isnull(b.cantidad,0))
o podemos hacer:
isnull(sum(a.cantidad),0) - isnull(sum(b.cantidad),0)
En el primer caso sabe dios cuantos isnull()'s ejecutamos
en el segundos solo dos.

Si no estas de acuerdo con que no es necesario el
sum(isnull(...,0)) entonces pon un ejemplo sencillo (una tabla,
dos registos y dos columnas tienen que ser suficiente), donde dices
cual es el resultado lógico esperado y del que pienses que no se
puede obtener en términos de isnull(sum(...),0).
Ten en cuenta para ello que estamos acordando y asumiento desde
el principio que interpretamos null's como ceros.

También te pido yo a tí que mires la consulta que
te envié yo para ver por qué no aparecen nulos
por ningun lado, los resultados son los esperados
y no se hace uso de sum(isnull(...,0)).


Saludos,
Carlos
#24 jeastman
11/11/2007 - 00:08 | Informe spam
Que tal Carlos.

Ok, comprendo y tienes razón, pensé que lo había dicho antes.

Y de hecho mi discusión no fue en tu punto sino en otros, incluso hice
la prueba de unos ejemplos que pasaste por ahi y efectivamente da los
mismos resultados, algo que no sabía y con lo cual tú aclaraste mi error
desde el inicio.

Luego, lo que yo hice fue hacer referencia a otras situaciones donde si
es necesario el sum( isnull () ) sobre isnull( sum() ), pero en ningún
caso para objetar lo que mensionaste.

Creo que no fui claro cuando dije que tenías la razón en su debido
momento y por eso estámos discutiendo en dos idiomas diferente, jajajaja.

Tranquilo viejo, efectivamente es cómo tu dices, y más cuando dices que
si algo se puede evitar, entonces debemos hacerlo.

Saludos hermano.


Carlos M. Calvelo escribió:
Mostrar la cita
#25 jeastman
11/11/2007 - 00:11 | Informe spam
Ups, está largo, pero de verdad me interesa, luego lo reviso con calma y
te paso el comentario.

Nuevamente gracias por tu interes de sacar a alguien de su error.

De seguro que si le dedicaré el tiempo.

Saludos.

Carlos M. Calvelo escribió:
Mostrar la cita
Ads by Google
Search Busqueda sugerida