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

Es posible hacer case en un sum...

Estas en el tema de Es posible hacer case en un sum... en el foro de Bases de Datos General en Foros del Web. Hola a todos, me gustaria saber si es posible realizar un CASE WHEN ELSE END dentro de un SUM... esto dentro de un subconsulta, el ...
  #1 (permalink)  
Antiguo 19/06/2008, 13:01
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 20 años
Puntos: 0
Es posible hacer case en un sum...

Hola a todos, me gustaria saber si es posible realizar un CASE WHEN ELSE END dentro de un SUM... esto dentro de un subconsulta, el problema es a raiz de que la tabla tiene cantidades totales por meses y cada campo pertenece a un mes
ejem: ansubl_i01=ene, ansubl_i02=feb, etc.

lo que busco es sumar dos conceptos ansubl + subsil y sacar un total partiendo de la fecha 01-10-2006.

si logro ejecutar la consulta de abajo funcionaria ya que la logica esta bien, creo...

el codigo es el siguiente:

(SELECT ISNULL(SUM(
CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(anticipos.ansubl_i01,0) + ISNULL(anticipos.subsil_i01,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(anticipos.ansubl_i02,0) + ISNULL(anticipos.subsil_i02,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i03,0) + ISNULL(anticipos.subsil_i03,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i04,0) + ISNULL(anticipos.subsil_i04,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i05,0) + ISNULL(anticipos.subsil_i05,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i06,0) + ISNULL(anticipos.subsil_i06,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i07,0) + ISNULL(anticipos.subsil_i07,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i08,0) + ISNULL(anticipos.subsil_i08,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN 0 ELSE ISNULL(ansubl_i09,0) + ISNULL(anticipos.subsil_i09,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN ISNULL(anticipos.ansubl_i10,0) + ISNULL(anticipos.subsil_i10,0)
ELSE ISNULL(anticipos.ansubl_i10,0) + ISNULL(anticipos.subsil_i10,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN ISNULL(anticipos.ansubl_i11,0) + ISNULL(anticipos.subsil_i11,0)
ELSE ISNULL(anticipos.ansubl_i11,0) + ISNULL(anticipos.subsil_i11,0) END
+ CASE anticipos.tiempo
WHEN 2006 THEN ISNULL(anticipos.ansubl_i12,0) + ISNULL(anticipos.subsil_i12,0)
ELSE ISNULL(anticipos.ansubl_i12,0) + ISNULL(anticipos.subsil_i12,0) END ,0)

FROM anticipos
WHERE datos_empleado.rut = anticipos.rut
AND anticipos.tiempo >= 2006
) AS subsidios,

bueno aquien me pueda ayudar se le agradece un monton.
  #2 (permalink)  
Antiguo 19/06/2008, 13:03
 
Fecha de Ingreso: noviembre-2004
Mensajes: 371
Antigüedad: 20 años
Puntos: 0
Respuesta: Es posible hacer case en un sum...

para completar la info, el query analizer me da el siguiente error:

The SUM function requires 1 arguments.

y en los campos existen datos y en caso de no existir o que los datos no correspondan a la fecha le asigno 0 en la consulta.

saludos
  #3 (permalink)  
Antiguo 19/06/2008, 16:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Es posible hacer case en un sum...

No he mirado más, pero he observado que la sintaxis del case when... está mal.
SELECT ... SUM(CASE WHEN campo1 > 5 THEN campo2 * 2 ELSE campo3 - 2 END) FROM tutabla...
Observa que tras el when viene el nombre del campo y no antes...
Por si sirve de ayuda.
Un consejo: no trates de probar toda la consulta de un golpe, porque podría haber otros problemas. Lanza una consulta como esta que te he puesto, pero con datos de tus campos y comprueba su efecto. Si funciona bien, aplícala completa.
Pero te diré que me resulta sospechoso el uso de la expresión .. THEN 0 ELSE ISNULL(ansubl_i09,0)
no entiendo demasiado bien ese ELSE y tampoco el isnull con dos valores; parece que quisieras usar IFNULL en lugar de ISNULL y hubieras confundido el término. No sé. Dinos qué es exactamente lo que quieres que haga, algo así como: en caso de que sea tal, se les suma esto, pero si no, se le resta. De ese modo podremos seguir tu lógica.

Última edición por jurena; 19/06/2008 a las 23:31
  #4 (permalink)  
Antiguo 20/06/2008, 03:39
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 9 meses
Puntos: 13
Respuesta: Es posible hacer case en un sum...

Amigo extremeño ;)
el CASE tiene dos sintaxis distintas (creo que es estandar):
1- CASE campo_a_evaluar WHEN valor1 ....
2- CASE WHEN campo=valor THEN .....

Cada una tiene una función distinta, aunque puede parecer que hacen lo mismo.

bitshoot: A mi me parece raro el tema de los ISNULL anidados, el SUM con + dentro...
Luego tienes cosas como:
+ CASE anticipos.tiempo
WHEN 2006 THEN ISNULL(anticipos.ansubl_i10,0) + ISNULL(anticipos.subsil_i10,0)
ELSE ISNULL(anticipos.ansubl_i10,0) + ISNULL(anticipos.subsil_i10,0) END
Hace lo mismo en ambos casos....
Si eres más especifico, como dice jurena, lo solucionamos rápido.

Salu2
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 23:13.