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

SUM() a Campos nulos indicados a 0

Estas en el tema de SUM() a Campos nulos indicados a 0 en el foro de Bases de Datos General en Foros del Web. Buenas tardes Tengo una BD Access, de la cual he realizado una consulta (SQL guardada en la BD) que viene de otras Consultas hasta llegar ...
  #1 (permalink)  
Antiguo 22/07/2011, 14:43
 
Fecha de Ingreso: octubre-2005
Mensajes: 76
Antigüedad: 18 años, 6 meses
Puntos: 5
SUM() a Campos nulos indicados a 0

Buenas tardes

Tengo una BD Access, de la cual he realizado una consulta (SQL guardada en la BD) que viene de otras Consultas hasta llegar a esta final.

La SQL me trae los datos solicitados, pero necesito agregar una Sumatoria de todos los campos, pero algunos de esos campos de algunos registros son campos vacios o nulos debido a un LEFT JOIN entre dos tablas.

Entonces el SUM() solo funciona si los campos que suma son todos numeros, pero si alguno (o mas de uno) es campo vacio, no se da la Suma. Estructuralmente todos los campos son numerico, pero el LEFT JOIN me deja esos campos vacios (los registros que no esten emparejados con la otra tabla claro).

Intente en el SUM() validar cada campo con CInt() porque con IIF(ISNULL(...)) logre que la SQL me cargara con 0 los nulos. Creo que el SUM(CInt(camp1)+CInt(campo2)+...)) no funciono.

Esta es la SQL hasta el momento sin mas cambios:

Código SQL:
Ver original
  1. SELECT TB1.numempleado, TB1.Nombre,
  2. IIF(ISNULL(TB1.cantHoras),0,TB1.cantHoras) AS CantHoras,
  3. IIF(ISNULL(TB1.HrsDiurna),0,TB1.HrsDiurna) AS HrsDiur,
  4. IIF(ISNULL(TB1.HrsNocturna),0,TB1.HrsNocturna) AS HrsNoct,
  5. IIF(ISNULL(TB1.HrsSabado),0,TB1.HrsSabado) AS HrsSab,
  6. IIF(ISNULL(TB1.pcf),0,TB1.pcf) AS PCF,
  7. IIF(ISNULL(TB1.pcf_ext),0,TB1.pcf_ext) AS PCF_EXT,
  8. IIF(ISNULL(TB1.pso_ponny),0,TB1.pso_ponny) AS PSO_PONNY,
  9. IIF(ISNULL(TB1.pso_comp),0,TB1.pso_comp) AS PSO_COMP,
  10. IIF(ISNULL(TB1.pso_tdc),0,TB1.pso_tdc) AS PSO_TDC,
  11. IIF(ISNULL(TB1.desc_comp_ponny),0,TB1.desc_comp_ponny) AS DESC_COMP_PONNY,
  12. IIF(ISNULL(TB2.cantidad),0,TB2.cantidad) AS CANTIDAD,
  13. SUM(TB1.cantHoras + TB1.HrsDiurna + TB1.HrsNocturna + TB1.HrsSabado + TB1.pcf + TB1.pcf_ext + TB1.pso_ponny + TB1.pso_comp + TB1.pso_tdc + TB1.desc_comp_ponny + TB2.cantidad) AS TOTAL
  14. FROM SQL_ASIGNACIONES_SECCION_2 AS TB1 INNER JOIN SQL_ASIGNACIONES_PSOJ_FINAL AS TB2 ON TB1.numempleado = TB2.numempleado
  15. GROUP BY TB1.numempleado, TB1.Nombre, TB1.cantHoras, TB1.HrsDiurna, TB1.HrsNocturna, TB1.HrsSabado, TB1.pcf, TB1.pcf_ext, TB1.pso_ponny, TB1.pso_comp, TB1.pso_tdc, TB1.desc_comp_ponny, TB2.cantidad;

Me coloca los campos vacios del LEFT JOIN en 0 pero el ultimo campo, el SUM() sigue sin poderme sumar en caso de encontrarse con un valor que no sea numerico. Repito que todos los campos originalmente son numericos pero el LEFT JOIN me los trae nulos por lo que supongo que no lo toma como un campo numerico desde luego y por ende, no hace la suma, a menos que todos sean numericos, cosa que no es.

Por cierto, el LEFT JOIN esta internamente en una de las Consultas (los FROM no son tablas, sino Consultas), lo comento porque en la SQL no se ve ningun LEFT JOIN sino un INNER JOIN, porque esta uniendo relacionalmente dos Consultas ya hechas previamente.

En resumen, como puedo Sumar varios campos donde algunos son vacios? como puedo hacer que SUM() los lea como numericos, siendo los vacios = 0
y haga la Suma de todos los campos.

Última edición por UserCod; 22/07/2011 a las 14:48
  #2 (permalink)  
Antiguo 22/07/2011, 15:05
 
Fecha de Ingreso: octubre-2005
Mensajes: 76
Antigüedad: 18 años, 6 meses
Puntos: 5
Respuesta: SUM() a Campos nulos indicados a 0

Bueno, gracias a dios (a diferencia de otras ocasiones donde me tardo horas, dias y hasta semanas dependiendo el caso del problema) al parecer pude hacer que la SQL hiciese la sumatoria, solo tenia que llamar en el SUM() los campos ya validados con IIF(ISNULL(campo1)) AS CAMP1.

En vez de hacer SUM(campo1 + campo2 + ...) AS TOTAL
Debia hacerlo con los Alias AS, asi SUM(CAMP1 + CAMP2 + ....) AS TOTAL

Quedando entonces casi la misma SQL pero con un leve ajuste de nombres de campos dentro del SUM().

Código SQL:
Ver original
  1. SELECT TB1.numempleado, TB1.Nombre,
  2. IIF(ISNULL(TB1.cantHoras),0,TB1.cantHoras) AS CantHoras,
  3. IIF(ISNULL(TB1.HrsDiurna),0,TB1.HrsDiurna) AS HrsDiur,
  4. IIF(ISNULL(TB1.HrsNocturna),0,TB1.HrsNocturna) AS HrsNoct,
  5. IIF(ISNULL(TB1.HrsSabado),0,TB1.HrsSabado) AS HrsSab,
  6. IIF(ISNULL(TB1.pcf),0,TB1.pcf) AS PCF,
  7. IIF(ISNULL(TB1.pcf_ext),0,TB1.pcf_ext) AS PCF_EXT,
  8. IIF(ISNULL(TB1.pso_ponny),0,TB1.pso_ponny) AS PSO_PONNY,
  9. IIF(ISNULL(TB1.pso_comp),0,TB1.pso_comp) AS PSO_COMP,
  10. IIF(ISNULL(TB1.pso_tdc),0,TB1.pso_tdc) AS PSO_TDC,
  11. IIF(ISNULL(TB1.desc_comp_ponny),0,TB1.desc_comp_ponny) AS DESC_COMP_PONNY,
  12. IIF(ISNULL(TB2.cantidad),0,TB2.cantidad) AS CANTIDAD,
  13. SUM(CInt(CantHoras) + CInt(HrsDiur) + CInt(HrsNoct) + CInt(HrsSab) + CInt(PCF) + CInt(PCF_EXT) + CInt(PSO_PONNY) + CInt(PSO_COMP) + CInt(PSO_TDC) + CInt(DESC_COMP_PONNY) + CInt(CANTIDAD)) AS TOTAL
  14. FROM SQL_ASIGNACIONES_SECCION_2 AS TB1 INNER JOIN SQL_ASIGNACIONES_PSOJ_FINAL AS TB2 ON TB1.numempleado = TB2.numempleado
  15. GROUP BY TB1.numempleado, TB1.Nombre, TB1.cantHoras, TB1.HrsDiurna, TB1.HrsNocturna, TB1.HrsSabado, TB1.pcf, TB1.pcf_ext, TB1.pso_ponny, TB1.pso_comp, TB1.pso_tdc, TB1.desc_comp_ponny, TB2.cantidad;

En todo caso, ojala que alguien tenga un problema igual o semejante esto le pueda ayudar.

saludos.

Etiquetas: access, bases-de-datos
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 13:31.