Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Quitar NULL de SUM() (https://www.clubdelphi.com/foros/showthread.php?t=65653)

salvica 03-01-2010 22:41:36

Quitar NULL de SUM()
 
Hola a tod@s y Feliz 2010 ;)

Tengo tres tablas (RECIBOS, INGRESOS y GASTOS) y deseo sacar el total ingresado y gastado en cada recibo, teniendo en cuenta que puede haber meses que no haya ingresos o gastos.
Para ello hago la siguiente consulta (en SQLITE-3):
Código SQL [-]
SELECT recibos.ID_CLAVE AS ID_RECIBO,
       recibos.MONTH AS MONTH,
      ( SELECT recibo_ingresos.CANTIDAD
          FROM recibo_ingresos
         WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE
      ) AS ALQUILER,
      ( SELECT SUM(recibo_ingresos.TOTAL)
          FROM recibo_ingresos
         WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE
      ) AS TOTAL_INGRESOS,
      ( SELECT SUM(CASE WHEN recibo_gastos.TOTAL ISNULL
                             THEN 0
                             ELSE recibo_gastos.TOTAL
                   END)
          FROM recibo_gastos
         WHERE recibo_gastos.ID_RECIBO = recibos.ID_CLAVE
      ) AS TOTAL_GASTOS
  FROM recibos
 WHERE recibos.ID_CONTRATO = "0000000024"
   AND recibos.YEAR = "2009"
El problema que se me plantea es que no puedo quitar los NULL del campo TOTAL_GASTOS.

¿Alguien sabe como se hace?

Gracias adelantadas
Salvica

defcon1_es 04-01-2010 09:10:26

Hola. Prueba con la función COALESCE.
Código SQL [-]
SELECT recibos.ID_CLAVE AS ID_RECIBO,        
recibos.MONTH AS MONTH,       
COALESCE( (SELECT recibo_ingresos.CANTIDAD FROM recibo_ingresos 
              WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE), 0) AS ALQUILER,       
COALESCE( (SELECT SUM(recibo_ingresos.TOTAL) FROM recibo_ingresos 
              WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE), 0) AS TOTAL_INGRESOS,       
COALESCE( (SELECT SUM(CASE WHEN recibo_gastos.TOTAL ISNULL THEN 0 ELSE recibo_gastos.TOTAL END)
              FROM recibo_gastos WHERE recibo_gastos.ID_RECIBO = recibos.ID_CLAVE), 0) AS TOTAL_GASTOS   
FROM recibos  
WHERE recibos.ID_CONTRATO = "0000000024"    AND 
          recibos.YEAR = "2009"

salvica 04-01-2010 20:31:45

Cita:

Empezado por defcon1_es (Mensaje 349947)
Hola. Prueba con la función COALESCE.
Código SQL [-]SELECT recibos.ID_CLAVE AS ID_RECIBO, recibos.MONTH AS MONTH, COALESCE( (SELECT recibo_ingresos.CANTIDAD FROM recibo_ingresos WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE), 0) AS ALQUILER, COALESCE( (SELECT SUM(recibo_ingresos.TOTAL) FROM recibo_ingresos WHERE recibo_ingresos.ID_RECIBO = recibos.ID_CLAVE), 0) AS TOTAL_INGRESOS, COALESCE( (SELECT SUM(CASE WHEN recibo_gastos.TOTAL ISNULL THEN 0 ELSE recibo_gastos.TOTAL END) FROM recibo_gastos WHERE recibo_gastos.ID_RECIBO = recibos.ID_CLAVE), 0) AS TOTAL_GASTOS FROM recibos WHERE recibos.ID_CONTRATO = "0000000024" AND recibos.YEAR = "2009"

Hola defcon1_es, ante todo gracias por responder, probaré el método aunque no me suena esa función en SQLite-3.

De todas formas luego te cuento como me ha ido.

Saludos
salvica

droguerman 04-01-2010 21:03:54

en SQLite es IFNULL
http://www.sqlite.org/lang_corefunc.html#ifnull

salvica 04-01-2010 21:15:47

Gracias defcon1_es, funciona perfectamente.

Cita:

Empezado por droguerman (Mensaje 350005)

Hola droguerman, era lo que yo pensaba pero según la documentación de SQLite (acabo de verlo) si TODOS los campos son NULL, SUM() devuelve NULL, y se recomienda que se utilice la función TOTAL() que, (en este caso particular), devuelve un CERO en formato FLOAT.

Habia visto en algunas consultas el COALESCE, pero creo que referida a Firebird :mad: y no caí en utilizarla.

Gracias a los dos por la aportación.
salvica


La franja horaria es GMT +2. Ahora son las 03:57:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi