Estoy mirando con más cuidado el código, y francamente hay algunas cosas que no le veo mucho sentido, e incluso que pueden tener resultados un tanto irreales o falsos.
Tomemos una de las consultas (todas son mas o menos similares), y analicemos un par de cosas:
Código MySQL:
Ver original e.id_ser,
emp.nombre_razonsocial,
CONCAT(p.Apellidos
,'-',p.Nombres
) 'Nombres', e.fecha,
TIME(e.fecha_Entrada
) 'Entrada', TIME(e.fecha_Salida_Almuerzo
) 'Salida_Almuerzo', TIME (e.fecha_Entrada_Almuerzo
) 'Entrada_Almuerzo', TIME (e.fecha_salida
) 'Salida_Laboral', INNER JOIN empresas emp
ON pe.id_empresa
=emp.id_empresa
Por lo pronto estás agrupando por sólo dos columnas de ocho, pero de esas solo dos están afectadas por funciones agregas. Lo que significa que las seis restantes pueden tener resultados irreales, ya que el GROUP BY tomará el primer valor que encuentre en la tabla y esconderá el resto. El que pongas ASC en la fecha es medio irrelevante, porque ese ASC no aplicará a esos otros cuatro campos, con lo que si bien la fecha puede ser del ultimo registro, el nombre, la razon social, las entradas y salidas, serán los primeros registros encontrados, aunque no coincidan con esos otros.
Pero le agregas agrupar por evento, por el ID de evento, con lo cual, además implicará que te devolverá un registro por cada registro de evento, y como cada uno de esos registros se corresponde a horas de entrada y salida, entonces el GROUP BY termina sin tener efectos en esos items,
Estas son sólo algunas de las observaciones a hacer. A esta debo agregar al menos tres cosas:
- Primero, en los SP existen clausulas para controlar el flujo, tales como CASE, por lo que no tiene ningún sentido usar IFs. Además, en lugar de hacer tantos anidamientos, podrías haber usado el ELSEIF, que es más lineal.
- En segundo lugar, no alcanzo a percibir mayores diferencias entre las distintas consultas, a excepción del valor de id_empresa, usado en el IF, con lo que en la mayoría de los casos deberías haber usado el parámetro, en lugar de harcodear innecesariamente el valor. tendrías posiblemente una única consulta, algo más dinámica. Hay, si, una consulta distinta, pero eso podria entrar en un ELSE sin problemas.
Sería magnífico que nos expliques exactamente qué tipo de resumen de datos se supone que obtienes, para verificar si realmente esa sintaxis cumple lo que tu deseas.
Por lo pronto, yo la plantearía así:
Código MySQL:
Ver originalDELIMITER $$
eventos.nombre_razonsocial,
eventos.id_ser,
eventos.Nombres,
IFNULL(eventos.fecha
, 'RESULTADO TOTAL SOCIO DE NEGOCIOS') FECHA
, eventos.Entrada,
eventos.Salida_Almuerzo,
eventos.Entrada_Almuerzo,
eventos.Total_Almuerzo,
eventos.Salida_Laboral,
eventos.Total_Labor
e.id_ser,
emp.nombre_razonsocial,
CONCAT(p.Apellidos
,'-',p.Nombres
) 'Nombres', e.fecha,
TIME(e.fecha_Entrada
) 'Entrada', TIME(e.fecha_Salida_Almuerzo
) 'Salida_Almuerzo', TIME (e.fecha_Entrada_Almuerzo
) 'Entrada_Almuerzo', TIME (e.fecha_salida
) 'Salida_Laboral', INNER JOIN empresas emp
ON pe.id_empresa
=emp.id_empresa
AND emp.id_empresa
= Grupo
eventos.nombre_razonsocial,
eventos.id_ser,
eventos.Nombres,
IFNULL(eventos.fecha
, 'RESULTADO TOTAL SOCIO DE NEGOCIOS') FECHA
, eventos.Entrada,
eventos.Salida_Almuerzo,
eventos.Entrada_Almuerzo,
eventos.Total_Almuerzo,
eventos.Salida_Laboral,
eventos.Total_Labor
e.id_ser,
emp.nombre_razonsocial,
CONCAT(p.Apellidos
,'-',p.Nombres
) 'Nombres', e.fecha,
TIME(e.fecha_Entrada
) 'Entrada', TIME(e.fecha_Salida_Almuerzo
) 'Salida_Almuerzo', TIME (e.fecha_Entrada_Almuerzo
) 'Entrada_Almuerzo', TIME (e.fecha_salida
) 'Salida_Laboral', INNER JOIN empresas emp
ON pe.id_empresa
=emp.id_empresa
DELIMITER ;
O mejor aún, lo intentaría con
sentencias preparadas:
Código MySQL:
Ver originalDELIMITER $$
eventos.nombre_razonsocial,
eventos.id_ser,
eventos.Nombres,
IFNULL(eventos.fecha, ''RESULTADO TOTAL SOCIO DE NEGOCIOS'') FECHA,
eventos.Entrada,
eventos.Salida_Almuerzo,
eventos.Entrada_Almuerzo,
eventos.Total_Almuerzo,
eventos.Salida_Laboral,
eventos.Total_Labor
FROM
(SELECT
e.id_ser,
emp.nombre_razonsocial,
CONCAT(p.Apellidos,'-',p.Nombres) Nombres,
e.fecha,
TIME(e.fecha_Entrada) Entrada,
TIME(e.fecha_Salida_Almuerzo) Salida_Almuerzo,
TIME (e.fecha_Entrada_Almuerzo) Entrada_Almuerzo,
SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) 'Total_Almuerzo',
TIME (e.fecha_salida) Salida_Laboral,
SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) Total_Labor
FROM eventos e
INNER JOIN personas p ON e.id_ser=p.id_ser
INNER JOIN personas_empresa pe ON e.id_ser=pe.id_ser
INNER JOIN empresas emp ON pe.id_empresa=emp.id_empresa
WHERE
fecha BETWEEN ? AND ? ';
SET @qry
= CONCAT(@qry
;, ' AND emp.id_empresa = ? '); SET @qry
; = CONCAT(@qry
;, ' GROUP BY e.id_ser, e.fecha ASC WITH ROLLUP');
PREPARE stmt1
FROM @query
;
EXECUTE stmt1
USING @fecha1
, @fecha2
, @grupo
; EXECUTE stmt1
USING @fecha1
, @fecha2
; DEALLOCATE @qry;
DELIMITER ;
Habría que probarlo...