Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Sumar valores distintos de NULL

Estas en el tema de Sumar valores distintos de NULL en el foro de Bases de Datos General en Foros del Web. Qué tal: Estoy realizando la suma de diferentes campos en mi base de datos. No tengo ningún problema cuando los campos contienen valores diferentes de ...
  #1 (permalink)  
Antiguo 07/06/2010, 10:53
 
Fecha de Ingreso: marzo-2010
Ubicación: Guadalajara, Jal
Mensajes: 91
Antigüedad: 14 años, 1 mes
Puntos: 1
Sumar valores distintos de NULL

Qué tal:

Estoy realizando la suma de diferentes campos en mi base de datos. No tengo ningún problema cuando los campos contienen valores diferentes de null, el problema es cuando algún campo está vacio.

Por ejemplo, yo hago esto en mi consulta:

SUM(campo1 + campo2 + campo3) AS suma

y me arroja la suma de los tres campos sin problema, pero cuando el campo1 contiene un valor NULL, la "suma" me aparece NULL también, aunque campo2 y campo3 sí contengan valores.

Quiero saber si alguien me puede indicar una idea sobre cómo realizar la suma de los campos que contengan valores, aunque los demás sean nulos.

Ya intenté con el DISTINCT pero creo que no tengo bien la sintaxis:

SUM(DISTINCT(NULL)campo1 + DISTINCT(NULL)campo2 + DISTINCT(NULL)campo3) AS suma

me aparece "suma" como NULL.

Gracias por su atención!
  #2 (permalink)  
Antiguo 07/06/2010, 10:55
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Sumar valores distintos de NULL

Cambia las propiedades de la tabla para que el valor por default de esos campos sea cero y no NULL.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 07/06/2010, 11:08
 
Fecha de Ingreso: marzo-2010
Ubicación: Guadalajara, Jal
Mensajes: 91
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Sumar valores distintos de NULL

Cita:
Iniciado por Triby Ver Mensaje
Cambia las propiedades de la tabla para que el valor por default de esos campos sea cero y no NULL.
Muy amable por tu respuesta Triby, lo que pasa que uno de los requerimientos que debo respetar es dejar la opción NULL en esos campos, por lo tanto no puedo modificar el tipo, existe otra manera diferente de controlar este comportamiento?

Sé paciente, gracias por la ayuda!
  #4 (permalink)  
Antiguo 07/06/2010, 11:15
 
Fecha de Ingreso: mayo-2010
Mensajes: 61
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Sumar valores distintos de NULL

Porque cuando recoges el valor de la base de datos no preguntas que si es null se ponga a cero y sino que se quede como esta?? seria la solucion mas facil no?
  #5 (permalink)  
Antiguo 07/06/2010, 11:25
 
Fecha de Ingreso: marzo-2010
Ubicación: Guadalajara, Jal
Mensajes: 91
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Sumar valores distintos de NULL

Cita:
Iniciado por adristb Ver Mensaje
Porque cuando recoges el valor de la base de datos no preguntas que si es null se ponga a cero y sino que se quede como esta?? seria la solucion mas facil no?
Pasa que estoy realizando una consulta directamente a la base de datos mediante sql, en este caso no utilizo formularios (creo que a eso te refieres), estuve investigando y me encontré con la cláusula DISTINCT, solo que no sé exactamente como echarla a funcionar!!!

Gracias por tu respuesta, sigo buscando información!
  #6 (permalink)  
Antiguo 07/06/2010, 11:53
 
Fecha de Ingreso: mayo-2010
Mensajes: 61
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Sumar valores distintos de NULL

no el distinct no tiene nada que ver, el distinct es para que si hay valores repetidos coja solo uno,
haber entonces que quieres hacer algo en SQL solo?? esque en ese caso 1º el tema no iria en este apartado y 2º prueba ha hacer esta instruccion si va bn

select suma(campo) as SUMA
from (tabla)
where (mismo campo del select) is not null

prueba y me dices haber que tal
  #7 (permalink)  
Antiguo 07/06/2010, 11:56
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: Sumar valores distintos de NULL

Usa coalesce (retorna el primer valor no nulo de entre sus argumentos):
Código MySQL:
Ver original
  1. coalesce(posibleValorNulo, 0)
Retornará el valor de la columna si no es nulo o cero en caso contrario. ¡Suerte!

PD: si quieres más información, mira esto.
  #8 (permalink)  
Antiguo 07/06/2010, 12:06
 
Fecha de Ingreso: marzo-2010
Ubicación: Guadalajara, Jal
Mensajes: 91
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Sumar valores distintos de NULL

Cita:
Iniciado por adristb Ver Mensaje
no el distinct no tiene nada que ver, el distinct es para que si hay valores repetidos coja solo uno,
haber entonces que quieres hacer algo en SQL solo?? esque en ese caso 1º el tema no iria en este apartado y 2º prueba ha hacer esta instruccion si va bn

select suma(campo) as SUMA
from (tabla)
where (mismo campo del select) is not null

prueba y me dices haber que tal
Tienes mucha razón, analicé bien el funcionamiento del DISTINCT y no sirve para lo que yo quería, tu opción es muy buena la del where, lo intenté y todo quedó bien!!! También probaré la solución del coalesce a ver qué tal!!!

Gracias por su valiosa ayuda!
  #9 (permalink)  
Antiguo 07/06/2010, 12:07
 
Fecha de Ingreso: marzo-2010
Ubicación: Guadalajara, Jal
Mensajes: 91
Antigüedad: 14 años, 1 mes
Puntos: 1
Respuesta: Sumar valores distintos de NULL

Cita:
Iniciado por dggluz Ver Mensaje
Usa coalesce (retorna el primer valor no nulo de entre sus argumentos):
Código MySQL:
Ver original
  1. coalesce(posibleValorNulo, 0)
Retornará el valor de la columna si no es nulo o cero en caso contrario. ¡Suerte!

PD: si quieres más información, mira [URL="http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce"]esto[/URL].
Esta respuesta me ayudó bastante, no conocía esta función, muchas gracias por el aporte!!!
  #10 (permalink)  
Antiguo 07/06/2010, 13:34
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Tema movido desde PHP a Bases de datos
  #11 (permalink)  
Antiguo 07/06/2010, 13:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Sumar valores distintos de NULL

NULL no es un dato, por lo que no sirve para seer usado en ningún tipo de operaciones. Por otro lado, si realizas o fuerzas la operación entre diferentes columnas, una de las cuales contiene un NULL, el resultado será NULL, porque NULL anula todo resultado...

O Sea:
Cita:
1 + 2 + 3 + 4 + NULL = NULL.
Entonces, el problema es que si quieres sumar ciertos campos y uno o mas de ellos pueden llegar a contener NULL, debes controlar el problema.
hay dos formas prácticas:
1) La que te provee dggluz:
Código MySQL:
Ver original
  1. SELECT SUM(COALESCE(campo1, 0) + COALESCE(campo2, 0) + COALESCE(campo3, 0)) suma
  2. FROM tabla;

2) Usando IFNULL().
Código MySQL:
Ver original
  1. SELECT SUM(IFNULL(campo1, 0) + IFNULL(campo2, 0) + IFNULL(campo3, 0)) suma
  2. FROM tabla;

La diferencia esencial entre ambas formas es que IFNULL opera sobre un sólo campo,mientras que COALESCE puede operar sobre varios campos o valores, devolviendo el primero que cumpla la condición de no ser NULL.

Código MySQL:
Ver original
  1. SELECT COALESCE(campo1, campo2, campo3, campo4) NoNulo
  2. FROM tabla;

Ahora bien, en el caso de querer hacer una suma entre los 3 campos, mas o menos como l planteas al principio, bien se podría hacer:
Código MySQL:
Ver original
  1. SELECT (SUM(campo1) + SUM(campo2) + SUM(campo3))  suma
  2. FROM tabla;
Ya que SUM() sólo opera sobre valores no nulos...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: distintos, null
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:44.