Ver Mensaje Individual
  #8 (permalink)  
Antiguo 22/02/2018, 04:12
7sistemas
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: select case suma incorrecta

Finalmente, encontré la consulta que devuelve los resultados correctos.
Me percaté de una condición que no había contemplado: cuando la entrada fue en el mes en curso, hay que verificar si ahora (el momento del calculo) es mayor o menor al mes solicitado.

De todas maneras, debo hacer mas pruebas para verificar al 100% la consulta.

Gracias Libras y Mortiprogramador.

Esta es la consulta, y la tabla, la misma.

Código MySQL:
Ver original
  1. set @iniciomes = '2018-02-01 00:00:00';
  2. set @finmes = '2018-02-28 23:59:59';
  3. set @cero = '0000-00-00 00:00:00';
  4.  
  5. select pa.id_personal ID, monthname(@iniciomes) as Mes, time_format(sec_to_time(SUM(pa.Horas)), '%H:%i') 'Horas totales',
  6. precio_hora 'Precio/Hora'
  7.   select id_personal,
  8.     case
  9.       # entrada en el mes en curso  
  10.       when ((entrada >= @iniciomes) and (entrada <= @finmes))
  11.     then
  12.       case
  13.         # salida en el mes en curso
  14.         when ((salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes))
  15.         then timestampdiff(second, entrada, salida)
  16.         # salida en el siguiente mes
  17.         when ((salida != @cero) and (salida > @finmes))
  18.         then timestampdiff(second, entrada, @finmes)
  19.         # sin salir, en el siguiente mes
  20.         when ((salida = @cero) and (now() > @finmes))
  21.         then timestampdiff(second, entrada, @finmes)
  22.         #sin salir, todavia en el mes
  23.         when ((salida = @cero) and (now() < @finmes))
  24.         then timestampdiff(second, entrada, now())
  25.       end
  26.  
  27.       # entrada en el mes anterior
  28.       when (entrada < @iniciomes)
  29.       then
  30.     case
  31.       # salida en el mes en curso
  32.       when ((salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes))
  33.       then timestampdiff(second, @iniciomes, salida)
  34.       # sin salir
  35.       when (salida = @cero)
  36.       then timestampdiff(second, @iniciomes, now())
  37.     end
  38.  
  39.     end as Horas
  40.     from personal_asistencia
  41.     where
  42.     case
  43.       when ((entrada >= @iniciomes) and (entrada <= @finmes))
  44.       then
  45.     case
  46.       when ((salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes))
  47.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes)
  48.      
  49.       when ((salida != @cero) and (salida > @finmes))
  50.       then (entrada >= @iniciomes) and (entrada <= @finmes) and
  51. (salida = (select salida from personal_asistencia where entrada >= @iniciomes and entrada <= @finmes and salida > @finmes limit 1))
  52.      
  53.       when ((salida = @cero) and (now() > @finmes))
  54.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida = @cero)
  55.      
  56.       when ((salida = @cero) and (now() < @finmes))
  57.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida = @cero)
  58.     end
  59.  
  60.     when (entrada < @iniciomes)
  61.     then
  62.       case
  63.         when ((salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes))
  64.         then (entrada < @iniciomes) and (salida != @cero) and (salida >= @iniciomes) and (salida <= @finmes)
  65.  
  66.         when (salida = @cero)
  67.         then (entrada < @iniciomes) and (salida = @cero)
  68.       end
  69.     end
  70. ) as pa
  71.  
  72. INNER JOIN personal ON pa.id_personal = personal.id
  73. INNER JOIN personal_precio_hora ON personal.id = personal_precio_hora.id_personal
  74. GROUP BY pa.id_personal;