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

#11 jeastman
05/11/2007 - 18:58 | Informe spam
Hola Alejandro.

Definitivamente.

Creo que generalicé el asunto del manejo de los null y no tomé en cuenta
algunos detalles.

Gracias por tus comentarios, de hecho me enteré de algo que no sabía.

Saludos.

Alejandro Mesa escribió:
Mostrar la cita
#12 Carlos M. Calvelo
05/11/2007 - 19:55 | Informe spam
Hola jeastman,

On 5 nov, 14:56, jeastman wrote:
Mostrar la cita
Esto último ("el resultado de la suma dará null") no es cierto.
Mira el primer ejemplo del otro post mio.

Mostrar la cita
Lo cual no es necesario.
isnull(sum(@impuesto * d.monto), 0) dará el mismo resultado.
Y para el que esté preocupado con la eficiencia, se ahorará
muchos isnull()'s

Mostrar la cita
select i.codProducto,
sum( d.cantidad ) as cantidadFacturado,
isnull(sum(r.cantidad), 0) as cantidadDevuelto,
sum(d.cantidad) - isnull(sum(r.cantidad), 0) as
cantidadEfectivaVentas
.


Mostrar la cita
Pensaba yo que con los ejemplos cortos que había dado estaba claro.
No va a cambiar el comportamiento del sum con nulos por dar
ejemplos mucho mas complicados. :)

Saludos,
Carlos
#13 jeastman
06/11/2007 - 05:12 | Informe spam
Compañeros, un saludos.

De verdad lamento el hecho de que no me he podido explicar claramente,
estoy deacuerdo con lo que ustedes dicen y de hecho he podido ver un par
de cosas que no sabía y agradesco eso.

Aqui incluyo un fragmento de código de algo que me pasó una vez, pero
como no he logrado explicarme aqui les pongo el emjemplo, por favor
ejecutenlo.

Nuevamente gracias por su paciencia y en especial por los conocimientos
expuesto, que como ya dije antes, también me ha ayudado a mi.

Saludos para todos

begin transaction


create table inventario (
codProducto int not null
)

create table facturaDetalle (
numFactura int not null,
codProducto int not null,
cantidad int not null,
monto money not null
)

create table devolucionVenta (
codProducto int not null,
cantidad int not null
)

insert into inventario values ( 1 )
insert into inventario values ( 2 )
insert into inventario values ( 3 )
insert into inventario values ( 4 )

insert into facturaDetalle values ( 1, 1, 2, 100 )
insert into facturaDetalle values ( 2, 2, 5, 200 )
insert into facturaDetalle values ( 3, 3, 3, 300 )
insert into facturaDetalle values ( 4, 2, 7, 900 )
insert into facturaDetalle values ( 5, 3, 2, 200 )
insert into facturaDetalle values ( 6, 1, 9, 700 )
insert into facturaDetalle values ( 7, 1, 5, 500 )


insert into devolucionVenta values ( 1, 2 )
insert into devolucionVenta values ( 1, 1 )
insert into devolucionVenta values ( 2, 1 )


select i.codProducto,
sum( f.cantidad ) as cantidad,
sum( f.cantidad * f.monto ) as monto
from inventario i left join facturaDetalle f on
f.codProducto = i.codProducto
group by i.codProducto

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
sum( f.cantidad - d.cantidad ) as ventaEfectiva
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

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
sum( f.cantidad - isnull( d.cantidad, 0 ) ) as ventaEfectiva
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

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
isnull( sum( f.cantidad - d.cantidad ), 0 ) as ventaEfectiva
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

rollback transaction

Obersevese con atención el resultado de las tres últimas consultas,
adicional, en mi caso, no me sirve que las consultas me retornen valores
NULL.

Alexis escribió:
Mostrar la cita
#14 jeastman
06/11/2007 - 05:24 | Informe spam
Disculpen, se me fue un error en el primer ejemplo.

Aqui está nuevamente.

begin transaction


create table inventario (
codProducto int not null
)

create table facturaDetalle (
numFactura int not null,
codProducto int not null,
cantidad int not null,
monto money not null
)

create table devolucionVenta (
codProducto int not null,
cantidad int not null
)

insert into inventario values ( 1 )
insert into inventario values ( 2 )
insert into inventario values ( 3 )
insert into inventario values ( 4 )

insert into facturaDetalle values ( 1, 1, 2, 100 )
insert into facturaDetalle values ( 2, 2, 5, 200 )
insert into facturaDetalle values ( 3, 3, 3, 300 )
insert into facturaDetalle values ( 4, 2, 7, 900 )
insert into facturaDetalle values ( 5, 3, 2, 200 )
insert into facturaDetalle values ( 6, 1, 9, 700 )
insert into facturaDetalle values ( 7, 1, 5, 500 )


insert into devolucionVenta values ( 1, 2 )
insert into devolucionVenta values ( 1, 1 )
insert into devolucionVenta values ( 2, 1 )


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

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
sum( f.cantidad ) - d.cantidad as ventaEfectiva
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

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
sum( f.cantidad ) - isnull( d.cantidad, 0 ) as ventaEfectiva
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

select i.codProducto,
sum( f.cantidad ) as cantidadFacturado,
isnull( sum( f.cantidad ) - d.cantidad, 0 ) as ventaEfectiva
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

rollback transaction

jeastman escribió:
Mostrar la cita
#15 Carlos M. Calvelo
06/11/2007 - 09:16 | Informe spam
Hola jeastman,

On 6 nov, 05:12, jeastman wrote:
Mostrar la cita
No pasa nada. Facilmente he podido yo haber metido la pata.
Ahora no tengo tiempo, pero ya miraré tu ejemplo mas detenidamente.

Saludos,
Carlos
Ads by Google
Search Busqueda sugerida