Jump to content


Photo

[RESUELTO] Evitar un null en sentencia


  • Please log in to reply
6 replies to this topic

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 19 May 2011 - 08:32 AM

Hola amigos, tengo la siguiente consulta:

select sum(importe)as Abono from cuen01 f , conc01 g where g.tipo = 'A' and f.tipo_mov = g.num_cpto

esta consulta devuelve la suma de los abonos en mi tabla de cuentas por cobrar , pero al no haber abonos me devuelve null.
lo que quiero es que me devuelva el valor 0 al no encontar abonos.

espero me hechen una mano.
saludos!
  • 0

#2 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 19 May 2011 - 09:09 AM

hola , ya lo solucione utilizando un coalesce.

SELECT coalesce(sum(importe),0) FROM cuen01 f , conc01 g WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto

  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 19 May 2011 - 10:03 AM

hola , ya lo solucione utilizando un coalesce.


SELECT coalesce(sum(importe),0) FROM cuen01 f , conc01 g WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto


En realidad es muy aconsejable que también apliques la función COALESCE dentro del SUM


SELECT coalesce(sum(coalesce(importe,0)),0)
FROM cuen01 f , conc01 g
WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto


¿ Porqué ?, porqué según el estándar SQL cuando sumas varios valores, y uno de ellos es nulo (es decir, indefinido), el resultado de toda la suma es nulo (indefinido).

Es decir, que si tienes los siguientes importes : 25, 30 y nulo. La suma sería nulo, y por tanto aplicando el COALESCE tal y como lo has puesto, tu consulta devolvería 0. En cambio si también aplicas la función COALESCE dentro del SUM, entonces sumarías los valores 25, 30 y 0, y por tanto la suma sería 55 (que creo que es lo que todos queremos en esta situación).

Saludos.
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 19 May 2011 - 10:40 AM

Entonces siguiendo la explicación de Marc... el primer coalesce no es ya necesario o si ?  ^o|




SELECT sum(coalesce(importe,0))
FROM cuen01 f , conc01 g
WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto



Saludox ! :)
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 19 May 2011 - 10:46 AM

Entonces siguiendo la explicación de Marc... el primer coalesce no es ya necesario o si ? 




SELECT sum(coalesce(importe,0))
FROM cuen01 f , conc01 g
WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto



Saludox !


Sí, sigue siendo necesario. Puesto que si no hay ningún registro para sumar en la consulta, entonces no sumará ningún valor, y por tanto el valor de la suma será nulo (indefinido). Así que seguimos necesitando un COALESCE externo a la Suma, para poder pasar a 0 estas situaciones.

Cada COALESCE sirve para funciones distintas. El COALESCE interno a la suma nos sirve para no sumar valores nulos que haya entre los registros a sumar, y que nos ocasionarían que la suma total también fuese nulo. En cambio el COALESCE externo a la suma nos sirve para pasar a 0 la suma en los casos en que no haya registros a sumar.

Saludos.
  • 0

#6 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 posts
  • LocationLa Ceiba-Atlantida-Honduras

Posted 19 May 2011 - 10:48 AM

Entonces siguiendo la explicación de Marc... el primer coalesce no es ya necesario o si ? 


si y no,
si en este caso , pero mi idea para esta consulta es mostrar los abonos por cliente, es decir un detalle de saldos, no quice poner toda la consulta para entender mas lo que queria hacer.

Marc, tines toda la razon, pero en mi caso siempre funcionara ya que nunca va haber un importe nulo, el valor por defecto de ese campo es 0.

gracias por sus comentarios amigos.

  • 0

#7 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 19 May 2011 - 10:50 AM


Entonces siguiendo la explicación de Marc... el primer coalesce no es ya necesario o si ? 




SELECT sum(coalesce(importe,0))
FROM cuen01 f , conc01 g
WHERE g.tipo = 'A' AND f.tipo_mov = g.num_cpto



Saludox !


Sí, sigue siendo necesario. Puesto que si no hay ningún registro para sumar en la consulta, entonces no sumará ningún valor, y por tanto el valor de la suma será nulo (indefinido). Así que seguimos necesitando un COALESCE externo a la Suma, para poder pasar a 0 estas situaciones.

Cada COALESCE sirve para funciones distintas. El COALESCE interno a la suma nos sirve para no sumar valores nulos que haya entre los registros a sumar, y que nos ocasionarían que la suma total también fuese nulo. En cambio el COALESCE externo a la suma nos sirve para pasar a 0 la suma en los casos en que no haya registros a sumar.

Saludos.


Buen punto... gracias

Saludox !
  • 0




IP.Board spam blocked by CleanTalk.