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

[SOLUCIONADO] Ejecutar consulta si cumple condicion

Estas en el tema de Ejecutar consulta si cumple condicion en el foro de Mysql en Foros del Web. Muy buenas tardes apreciados Ingenieros Tengo la siguiente inquietud Tengo un SP Que recibe 03 parámetros y de acuerdo al valor de un parametro debe ...
  #1 (permalink)  
Antiguo 07/11/2013, 15:59
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 10 años, 5 meses
Puntos: 0
Ejecutar consulta si cumple condicion

Muy buenas tardes apreciados Ingenieros
Tengo la siguiente inquietud
Tengo un SP Que recibe 03 parámetros y de acuerdo al valor de un parametro debe ejecutarse la consulta que corresponda algo como un switch case

Ejemplo

Código MySQL:
Ver original
  1. create  procedure  miconsulta(IN  fecha1 DATE, fecha2 DATE,grupo int)                  
  2.     begin                
  3.           if grupo=2 then
  4.          
  5.     SELECT
  6.     eventos.nombre_razonsoMARCACION_EMPLEADOcial,
  7.     eventos.id_ser,
  8.     eventos.Nombres,
  9.     IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  10.     eventos.Entrada,
  11.     eventos.Salida_Almuerzo,
  12.     eventos.Entrada_Almuerzo,
  13.     eventos.Total_Almuerzo,
  14.     eventos.Salida_Laboral,
  15.     eventos.Total_Labor
  16.       FROM (
  17.      
  18.     SELECT  e.id_ser,
  19.     emp.nombre_razonsocial,
  20.     CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  21.     e.fecha,
  22.     TIME(e.fecha_Entrada) AS 'Entrada',
  23.     TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  24.     TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  25.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  26.     TIME (e.fecha_salida) AS 'Salida_Laboral',
  27.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  28.      
  29.     FROM (eventos e INNER JOIN personas p
  30.     ON e.id_ser=p.id_ser
  31.      INNER JOIN  personas_empresa pe
  32.       ON e.id_ser=pe.id_ser
  33.        INNER JOIN  empresas emp
  34.        ON pe.id_empresa=emp.id_empresa)
  35.      
  36.     WHERE fecha BETWEEN fecha1 AND fecha2
  37.     #WHERE e.fecha BETWEEN '2013-10-01' AND '2013-10-15'
  38.     and  emp.id_empresa=2
  39.     GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  40.     LIMIT 2000
  41.     ) AS eventos;
  42.    
  43.     if grupo=3
  44.    
  45.     eventos.nombre_razonsocial,
  46.     eventos.id_ser,
  47.     eventos.Nombres,
  48.     IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  49.     eventos.Entrada,
  50.     eventos.Salida_Almuerzo,
  51.     eventos.Entrada_Almuerzo,
  52.     eventos.Total_Almuerzo,
  53.     eventos.Salida_Laboral,
  54.     eventos.Total_Labor
  55.       FROM (
  56.      
  57.     SELECT  e.id_ser,
  58.     emp.nombre_razonsocial,
  59.     CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  60.     e.fecha,
  61.     TIME(e.fecha_Entrada) AS 'Entrada',
  62.     TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  63.     TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  64.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  65.     TIME (e.fecha_salida) AS 'Salida_Laboral',
  66.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  67.      
  68.     FROM (eventos e INNER JOIN personas p
  69.     ON e.id_ser=p.id_ser
  70.      INNER JOIN  personas_empresa pe
  71.       ON e.id_ser=pe.id_ser
  72.        INNER JOIN  empresas emp
  73.        ON pe.id_empresa=emp.id_empresa)
  74.      
  75.     WHERE fecha BETWEEN fecha1 AND fecha2
  76.        
  77.     and  emp.id_empresa=3
  78.     GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  79.     LIMIT 2000
  80.     ) AS eventos;
  81.     END if;
  82.     END if;
  83.     END$$


La verdad no me funciona
alguien en este maravilloso foro me po

Última edición por gnzsoloyo; 07/11/2013 a las 19:20 Razón: SQL sin etiqutar. Usar Highlight "MySQL"
  #2 (permalink)  
Antiguo 07/11/2013, 16:23
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Ejecutar consulta si cumple condicion

Ingenieros Solicito sus Disculpas,Pero ya encontré los errores aquí dejo el código
Ahora una ultima pregunta son 10 Opciones o mejor dicho ya condiciones
si es una Buena practica hacerlo así, Quedo atento a sus amables respuestas

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE MICONSULTA(IN  fecha1 DATE, fecha2 DATE,Grupo int )
  4. if Grupo=2 then
  5.  
  6. eventos.nombre_razonsocial,
  7. eventos.id_ser,
  8. eventos.Nombres,
  9. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  10. eventos.Entrada,
  11. eventos.Salida_Almuerzo,
  12. eventos.Entrada_Almuerzo,
  13. eventos.Total_Almuerzo,
  14. eventos.Salida_Laboral,
  15. eventos.Total_Labor
  16.   FROM (
  17.  
  18. SELECT  e.id_ser,
  19. emp.nombre_razonsocial,
  20. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  21. e.fecha,
  22. TIME(e.fecha_Entrada) AS 'Entrada',
  23. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  24. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  25. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  26. TIME (e.fecha_salida) AS 'Salida_Laboral',
  27. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  28.  
  29. FROM (eventos e INNER JOIN personas p
  30. ON e.id_ser=p.id_ser
  31.  INNER JOIN  personas_empresa pe
  32.   ON e.id_ser=pe.id_ser
  33.    INNER JOIN  empresas emp
  34.    ON pe.id_empresa=emp.id_empresa)
  35.  
  36. WHERE fecha BETWEEN fecha1 AND fecha2
  37. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  38. and  emp.id_empresa=2
  39. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  40. LIMIT 2000
  41. ) AS eventos;
  42.  
  43.  
  44. eventos.nombre_razonsocial,
  45. eventos.id_ser,
  46. eventos.Nombres,
  47. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  48. eventos.Entrada,
  49. eventos.Salida_Almuerzo,
  50. eventos.Entrada_Almuerzo,
  51. eventos.Total_Almuerzo,
  52. eventos.Salida_Laboral,
  53. eventos.Total_Labor
  54.   FROM (
  55.  
  56. SELECT  e.id_ser,
  57. emp.nombre_razonsocial,
  58. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  59. e.fecha,
  60. TIME(e.fecha_Entrada) AS 'Entrada',
  61. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  62. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  63. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  64. TIME (e.fecha_salida) AS 'Salida_Laboral',
  65. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  66.  
  67. FROM (eventos e INNER JOIN personas p
  68. ON e.id_ser=p.id_ser
  69.  INNER JOIN  personas_empresa pe
  70.   ON e.id_ser=pe.id_ser
  71.    INNER JOIN  empresas emp
  72.    ON pe.id_empresa=emp.id_empresa)
  73.  
  74. WHERE fecha BETWEEN fecha1 AND fecha2
  75. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  76. AND  emp.id_empresa=3
  77. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  78. LIMIT 2000
  79. ) AS eventos;
  80.  
  81.  
  82.     END$$
  83.  
  84. DELIMITER ;





De antemano muchas gracias por su colaboración y orientación
Desde Bogota Colombia
Beimar Trujillo

Última edición por gnzsoloyo; 07/11/2013 a las 19:20 Razón: SQL sin etiqutar. Usar Highlight "MySQL"
  #3 (permalink)  
Antiguo 07/11/2013, 16:33
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Ejecutar consulta si cumple condicion

<saludos>
Pues si la idea es dejar los querys directamente en bd,
esta es una buena opción

Sin embargo, no se si se pueda manejar un elemento
de tipo array dentro del SP, esto para no hacer los IF
sino que al array tenga tantos elementos como posibles
valores tenga el parámetro del grupo

Me explico

Ej:

Cita:
Editado: Código de programacion no permitido en foros de Bases de Datos. Leer las normas, por favor.
Código SQL:
Ver original
  1. query[1] = 'Select...'; query[2] = 'Select...';
Y luego en el SP solo ejecutar
Cita:
Editado: Código de programacion no permitido en foros de Bases de Datos.

Código SQL:
Ver original
  1. query[Grupo];
Esto solo evitaría crear los IF y tener agrupados los querys en un array

</saludos>
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 07/11/2013 a las 21:22
  #4 (permalink)  
Antiguo 08/11/2013, 06:50
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Ejecutar consulta si cumple condicion

Apreciados Ingenieros este Procedimiento me funciona Perfecto
me gustaría saber si alguien tiene una mejor forma de mejorar el performance
y algun ejemplo
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE MICONSULTA(IN  fecha1 DATE, fecha2 DATE,Grupo INT )
  4.  
  5. IF Grupo=2 THEN
  6.  
  7. eventos.nombre_razonsocial,
  8. eventos.id_ser,
  9. eventos.Nombres,
  10. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  11. eventos.Entrada,
  12. eventos.Salida_Almuerzo,
  13. eventos.Entrada_Almuerzo,
  14. eventos.Total_Almuerzo,
  15. eventos.Salida_Laboral,
  16. eventos.Total_Labor
  17.  
  18.   FROM (
  19.  
  20. SELECT  e.id_ser,
  21. emp.nombre_razonsocial,
  22. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  23. e.fecha,
  24. TIME(e.fecha_Entrada) AS 'Entrada',
  25. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  26. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  27. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  28. TIME (e.fecha_salida) AS 'Salida_Laboral',
  29. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  30.  
  31. FROM (eventos e INNER JOIN personas p
  32. ON e.id_ser=p.id_ser
  33.  INNER JOIN  personas_empresa pe
  34.   ON e.id_ser=pe.id_ser
  35.    INNER JOIN  empresas emp
  36.    ON pe.id_empresa=emp.id_empresa)
  37.  
  38. WHERE fecha BETWEEN fecha1 AND fecha2
  39. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  40. AND  emp.id_empresa=2
  41. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  42. LIMIT 2000
  43. ) AS eventos;
  44.  
  45. ELSE IF Grupo=3 THEN
  46.  
  47. eventos.nombre_razonsocial,
  48. eventos.id_ser,
  49. eventos.Nombres,
  50. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  51. eventos.Entrada,
  52. eventos.Salida_Almuerzo,
  53. eventos.Entrada_Almuerzo,
  54. eventos.Total_Almuerzo,
  55. eventos.Salida_Laboral,
  56. eventos.Total_Labor
  57.   FROM (
  58.  
  59. SELECT  e.id_ser,
  60. emp.nombre_razonsocial,
  61. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  62. e.fecha,
  63. TIME(e.fecha_Entrada) AS 'Entrada',
  64. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  65. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  66. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  67. TIME (e.fecha_salida) AS 'Salida_Laboral',
  68. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  69.  
  70. FROM (eventos e INNER JOIN personas p
  71. ON e.id_ser=p.id_ser
  72.  INNER JOIN  personas_empresa pe
  73.   ON e.id_ser=pe.id_ser
  74.    INNER JOIN  empresas emp
  75.    ON pe.id_empresa=emp.id_empresa)
  76.  
  77. WHERE fecha BETWEEN fecha1 AND fecha2
  78. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  79. AND  emp.id_empresa=3
  80. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  81. LIMIT 2000
  82. ) AS eventos;
  83.  
  84. ELSE  IF Grupo=4 THEN
  85.  
  86. eventos.nombre_razonsocial,
  87. eventos.id_ser,
  88. eventos.Nombres,
  89. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  90. eventos.Entrada,
  91. eventos.Salida_Almuerzo,
  92. eventos.Entrada_Almuerzo,
  93. eventos.Total_Almuerzo,
  94. eventos.Salida_Laboral,
  95. eventos.Total_Labor
  96.   FROM (
  97.  
  98. SELECT  e.id_ser,
  99. emp.nombre_razonsocial,
  100. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  101. e.fecha,
  102. TIME(e.fecha_Entrada) AS 'Entrada',
  103. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  104. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  105. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  106. TIME (e.fecha_salida) AS 'Salida_Laboral',
  107. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  108.  
  109. FROM (eventos e INNER JOIN personas p
  110. ON e.id_ser=p.id_ser
  111.  INNER JOIN  personas_empresa pe
  112.   ON e.id_ser=pe.id_ser
  113.    INNER JOIN  empresas emp
  114.    ON pe.id_empresa=emp.id_empresa)
  115.  
  116. WHERE fecha BETWEEN fecha1 AND fecha2
  117. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  118. AND  emp.id_empresa=4
  119. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  120. LIMIT 2000
  121. ) AS eventos;
  122.  
  123. ELSE IF Grupo=5 THEN
  124.  
  125. eventos.nombre_razonsocial,
  126. eventos.id_ser,
  127. eventos.Nombres,
  128. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  129. eventos.Entrada,
  130. eventos.Salida_Almuerzo,
  131. eventos.Entrada_Almuerzo,
  132. eventos.Total_Almuerzo,
  133. eventos.Salida_Laboral,
  134. eventos.Total_Labor
  135.   FROM (
  136.  
  137. SELECT  e.id_ser,
  138. emp.nombre_razonsocial,
  139. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  140. e.fecha,
  141. TIME(e.fecha_Entrada) AS 'Entrada',
  142. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  143. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  144. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  145. TIME (e.fecha_salida) AS 'Salida_Laboral',
  146. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  147.  
  148. FROM (eventos e INNER JOIN personas p
  149. ON e.id_ser=p.id_ser
  150.  INNER JOIN  personas_empresa pe
  151.   ON e.id_ser=pe.id_ser
  152.    INNER JOIN  empresas emp
  153.    ON pe.id_empresa=emp.id_empresa)
  154.  
  155. WHERE fecha BETWEEN fecha1 AND fecha2
  156. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  157. AND  emp.id_empresa=5
  158. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  159. LIMIT 2000
  160. ) AS eventos;
  161.  
  162. ELSE  IF Grupo=6 THEN
  163.  
  164. eventos.nombre_razonsocial,
  165. eventos.id_ser,
  166. eventos.Nombres,
  167. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  168. eventos.Entrada,
  169. eventos.Salida_Almuerzo,
  170. eventos.Entrada_Almuerzo,
  171. eventos.Total_Almuerzo,
  172. eventos.Salida_Laboral,
  173. eventos.Total_Labor
  174.   FROM (
  175.  
  176. SELECT  e.id_ser,
  177. emp.nombre_razonsocial,
  178. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  179. e.fecha,
  180. TIME(e.fecha_Entrada) AS 'Entrada',
  181. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  182. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  183. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  184. TIME (e.fecha_salida) AS 'Salida_Laboral',
  185. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  186.  
  187. FROM (eventos e INNER JOIN personas p
  188. ON e.id_ser=p.id_ser
  189.  INNER JOIN  personas_empresa pe
  190.   ON e.id_ser=pe.id_ser
  191.    INNER JOIN  empresas emp
  192.    ON pe.id_empresa=emp.id_empresa)
  193.  
  194. WHERE fecha BETWEEN fecha1 AND fecha2
  195. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  196. AND  emp.id_empresa=6
  197. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  198. LIMIT 2000
  199. ) AS eventos;
  200.  
  201. ELSE IF Grupo=7 THEN
  202.  
  203. eventos.nombre_razonsocial,
  204. eventos.id_ser,
  205. eventos.Nombres,
  206. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  207. eventos.Entrada,
  208. eventos.Salida_Almuerzo,
  209. eventos.Entrada_Almuerzo,
  210. eventos.Total_Almuerzo,
  211. eventos.Salida_Laboral,
  212. eventos.Total_Labor
  213.   FROM (
  214.  
  215. SELECT  e.id_ser,
  216. emp.nombre_razonsocial,
  217. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  218. e.fecha,
  219. TIME(e.fecha_Entrada) AS 'Entrada',
  220. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  221. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  222. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  223. TIME (e.fecha_salida) AS 'Salida_Laboral',
  224. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  225.  
  226. FROM (eventos e INNER JOIN personas p
  227. ON e.id_ser=p.id_ser
  228.  INNER JOIN  personas_empresa pe
  229.   ON e.id_ser=pe.id_ser
  230.    INNER JOIN  empresas emp
  231.    ON pe.id_empresa=emp.id_empresa)
  232.  
  233. WHERE fecha BETWEEN fecha1 AND fecha2
  234. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  235. AND  emp.id_empresa=7
  236. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  237. LIMIT 2000
  238. ) AS eventos;
  239.  
  240. ELSE IF Grupo=8 THEN
  241.  
  242. eventos.nombre_razonsocial,
  243. eventos.id_ser,
  244. eventos.Nombres,
  245. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  246. eventos.Entrada,
  247. eventos.Salida_Almuerzo,
  248. eventos.Entrada_Almuerzo,
  249. eventos.Total_Almuerzo,
  250. eventos.Salida_Laboral,
  251. eventos.Total_Labor
  252.   FROM (
  253.  
  254. SELECT  e.id_ser,
  255. emp.nombre_razonsocial,
  256. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  257. e.fecha,
  258. TIME(e.fecha_Entrada) AS 'Entrada',
  259. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  260. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  261. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  262. TIME (e.fecha_salida) AS 'Salida_Laboral',
  263. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  264.  
  265. FROM (eventos e INNER JOIN personas p
  266. ON e.id_ser=p.id_ser
  267.  INNER JOIN  personas_empresa pe
  268.   ON e.id_ser=pe.id_ser
  269.    INNER JOIN  empresas emp
  270.    ON pe.id_empresa=emp.id_empresa)
  271.  
  272. WHERE fecha BETWEEN fecha1 AND fecha2
  273. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  274. AND  emp.id_empresa=8
  275. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  276. LIMIT 2000
  277. ) AS eventos;
  278.  
  279.  
  280.  
  281. eventos.nombre_razonsocial,
  282. eventos.id_ser,
  283. eventos.Nombres,
  284. IFNULL(eventos.fecha, "RESULTADO TOTAL SOCIO DE NEGOCIOS") AS 'FECHA',
  285. eventos.Entrada,
  286. eventos.Salida_Almuerzo,
  287. eventos.Entrada_Almuerzo,
  288. eventos.Total_Almuerzo,
  289. eventos.Salida_Laboral,
  290. eventos.Total_Labor
  291.   FROM (
  292.  
  293. SELECT  e.id_ser,
  294. emp.nombre_razonsocial,
  295. CONCAT(p.Apellidos,'-',p.Nombres) AS 'Nombres',
  296. e.fecha,
  297. TIME(e.fecha_Entrada) AS 'Entrada',
  298. TIME(e.fecha_Salida_Almuerzo) AS 'Salida_Almuerzo',
  299. TIME (e.fecha_Entrada_Almuerzo) AS 'Entrada_Almuerzo',
  300. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) AS 'Total_Almuerzo',
  301. TIME (e.fecha_salida) AS 'Salida_Laboral',
  302. SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) AS 'Total_Labor'
  303.  
  304. FROM (eventos e INNER JOIN personas p
  305. ON e.id_ser=p.id_ser
  306.  INNER JOIN  personas_empresa pe
  307.   ON e.id_ser=pe.id_ser
  308.    INNER JOIN  empresas emp
  309.    ON pe.id_empresa=emp.id_empresa)
  310.  
  311. WHERE fecha BETWEEN fecha1 AND fecha2
  312. #WHERE fecha BETWEEN '2013-10-01' AND '2013-10-15'
  313. GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  314. LIMIT 2000
  315. ) AS eventos;
  316.  
  317.     END IF;
  318.         END IF;
  319.             END IF;
  320.                 END IF;
  321.                     END IF;
  322.                         END IF;
  323.  
  324.     END$$
  325.  
  326. DELIMITER ;

de Antemano muchas gracias por su colaboración
Cordial saludo

Última edición por gnzsoloyo; 08/11/2013 a las 07:20
  #5 (permalink)  
Antiguo 08/11/2013, 07:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar consulta si cumple condicion

Si el código es el mismo que el anterior, por favor, no lo repitas. Termina confundiendo.
Por otro lado, usa los Highlights del combo para etiquetar lo que es MySQL y SQL. Facilita mucho la lectura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 08/11/2013, 07:32
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Ejecutar consulta si cumple condicion

Hola gnzsoloyo Muchas gracias por responder
El codigo que puse anteriormente, no es Igual al anterior
ya que le faltaba identarlo y no habia puesto los
else if
y muchas gracias por tu corrección de Highlights no conocía esa herramienta en el Foro

Ahora si te puedo molestar me gustaria saber de que forma harias el sp que te puse anteriormente para mejorar performance

y como hacer para cuando la variable Grupo no tenga ningun valor
desde el Frond End algunos usuarios no tienen la opcion de seleccionar el Grupo
entonces no llegaría nada a esa variable


de antemano muchas gracias por tu Tiempo,y Orientacion
Cordial saludo
Beimar Trujillo
desde Bogota Colombia
  #7 (permalink)  
Antiguo 08/11/2013, 11:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar consulta si cumple condicion

Estuve mirando un poco por encima el código, y me da la imrepsión e que eso se puede hacer de modos muchísimos más simples.
De todos modos es algo que debo revisar con cuidado, proque hay que ordenar correctamente ese script para poder entenderlo. Tal como lo has indentado no alcanza a verse la lógica de las consulas.
Esta noche lo reviso en casa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 08/11/2013, 20:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar consulta si cumple condicion

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
  1.     e.id_ser,
  2.     emp.nombre_razonsocial,
  3.     CONCAT(p.Apellidos,'-',p.Nombres) 'Nombres',
  4.     e.fecha,
  5.     TIME(e.fecha_Entrada) 'Entrada',
  6.     TIME(e.fecha_Salida_Almuerzo) 'Salida_Almuerzo',
  7.     TIME (e.fecha_Entrada_Almuerzo) 'Entrada_Almuerzo',
  8.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) 'Total_Almuerzo',
  9.     TIME (e.fecha_salida) 'Salida_Laboral',
  10.     SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) 'Total_Labor'
  11. FROM eventos e
  12.     INNER JOIN personas p ON e.id_ser=p.id_ser
  13.     INNER JOIN  personas_empresa pe ON e.id_ser=pe.id_ser
  14.     INNER JOIN  empresas emp ON pe.id_empresa=emp.id_empresa
  15.     fecha BETWEEN fecha1 AND fecha2
  16.     AND  emp.id_empresa=3
  17. GROUP BY e.id_ser, e.fecha ASC WITH ROLLUP
  18. LIMIT 2000;
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 original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE MICONSULTA(IN fecha1 DATE, fecha2 DATE,Grupo INT)
  4.  
  5.     IF Grupo > 0 THEN
  6.         SELECT
  7.             eventos.nombre_razonsocial,
  8.             eventos.id_ser,
  9.             eventos.Nombres,
  10.             IFNULL(eventos.fecha, 'RESULTADO TOTAL SOCIO DE NEGOCIOS') FECHA,
  11.             eventos.Entrada,
  12.             eventos.Salida_Almuerzo,
  13.             eventos.Entrada_Almuerzo,
  14.             eventos.Total_Almuerzo,
  15.             eventos.Salida_Laboral,
  16.             eventos.Total_Labor
  17.         FROM
  18.             (SELECT  
  19.                 e.id_ser,
  20.                 emp.nombre_razonsocial,
  21.                 CONCAT(p.Apellidos,'-',p.Nombres) 'Nombres',
  22.                 e.fecha,
  23.                 TIME(e.fecha_Entrada) 'Entrada',
  24.                 TIME(e.fecha_Salida_Almuerzo) 'Salida_Almuerzo',
  25.                 TIME (e.fecha_Entrada_Almuerzo) 'Entrada_Almuerzo',
  26.                 SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) 'Total_Almuerzo',
  27.                 TIME (e.fecha_salida) 'Salida_Laboral',
  28.                 SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) 'Total_Labor'
  29.             FROM eventos e
  30.                 INNER JOIN personas p ON e.id_ser=p.id_ser
  31.                 INNER JOIN  personas_empresa pe ON e.id_ser=pe.id_ser
  32.                 INNER JOIN  empresas emp ON pe.id_empresa=emp.id_empresa
  33.             WHERE
  34.                 fecha BETWEEN fecha1 AND fecha2
  35.                 AND  emp.id_empresa = Grupo
  36.             GROUP BY e.id_ser, e.fecha ASC WITH ROLLUP
  37.     ELSE
  38.         SELECT
  39.             eventos.nombre_razonsocial,
  40.             eventos.id_ser,
  41.             eventos.Nombres,
  42.             IFNULL(eventos.fecha, 'RESULTADO TOTAL SOCIO DE NEGOCIOS') FECHA,
  43.             eventos.Entrada,
  44.             eventos.Salida_Almuerzo,
  45.             eventos.Entrada_Almuerzo,
  46.             eventos.Total_Almuerzo,
  47.             eventos.Salida_Laboral,
  48.             eventos.Total_Labor
  49.         FROM
  50.             (SELECT  
  51.                 e.id_ser,
  52.                 emp.nombre_razonsocial,
  53.                 CONCAT(p.Apellidos,'-',p.Nombres) 'Nombres',
  54.                 e.fecha,
  55.                 TIME(e.fecha_Entrada) 'Entrada',
  56.                 TIME(e.fecha_Salida_Almuerzo) 'Salida_Almuerzo',
  57.                 TIME (e.fecha_Entrada_Almuerzo) 'Entrada_Almuerzo',
  58.                 SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) 'Total_Almuerzo',
  59.                 TIME (e.fecha_salida) 'Salida_Laboral',
  60.                 SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) 'Total_Labor'
  61.             FROM eventos e
  62.                 INNER JOIN personas p ON e.id_ser=p.id_ser
  63.                 INNER JOIN  personas_empresa pe ON e.id_ser=pe.id_ser
  64.                 INNER JOIN  empresas emp ON pe.id_empresa=emp.id_empresa
  65.             WHERE fecha BETWEEN fecha1 AND fecha2
  66.             GROUP BY e.id_ser,e.fecha ASC WITH ROLLUP
  67.             LIMIT 2000) eventos;
  68.     END IF;
  69. END$$
  70. DELIMITER ;
O mejor aún, lo intentaría con sentencias preparadas:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE MICONSULTA(IN fecha1 DATE, fecha2 DATE,Grupo INT)
  4.     SET @qry = '';
  5.     SET @fecha1 = NOW();
  6.     SET @fecha2 = NOW();
  7.    
  8.     SET @qry = 'SELECT
  9.            eventos.nombre_razonsocial,
  10.            eventos.id_ser,
  11.            eventos.Nombres,
  12.            IFNULL(eventos.fecha, ''RESULTADO TOTAL SOCIO DE NEGOCIOS'') FECHA,
  13.            eventos.Entrada,
  14.            eventos.Salida_Almuerzo,
  15.            eventos.Entrada_Almuerzo,
  16.            eventos.Total_Almuerzo,
  17.            eventos.Salida_Laboral,
  18.            eventos.Total_Labor
  19.        FROM
  20.            (SELECT  
  21.                e.id_ser,
  22.                emp.nombre_razonsocial,
  23.                CONCAT(p.Apellidos,'-',p.Nombres) Nombres,
  24.                e.fecha,
  25.                TIME(e.fecha_Entrada) Entrada,
  26.                TIME(e.fecha_Salida_Almuerzo) Salida_Almuerzo,
  27.                TIME (e.fecha_Entrada_Almuerzo) Entrada_Almuerzo,
  28.                SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Entrada_Almuerzo) - TIME_TO_SEC(e.fecha_Salida_Almuerzo)))) 'Total_Almuerzo',
  29.                TIME (e.fecha_salida) Salida_Laboral,
  30.                SEC_TO_TIME(SUM((TIME_TO_SEC(e.fecha_Salida) - TIME_TO_SEC(e.fecha_Entrada)))) Total_Labor
  31.            FROM eventos e
  32.                INNER JOIN personas p ON e.id_ser=p.id_ser
  33.                INNER JOIN  personas_empresa pe ON e.id_ser=pe.id_ser
  34.                INNER JOIN  empresas emp ON pe.id_empresa=emp.id_empresa
  35.            WHERE
  36.                fecha BETWEEN ? AND ? ';
  37.     IF qry; > 0 THEN
  38.         SET @qry = CONCAT(@qry;, ' AND  emp.id_empresa = ? ');
  39.     END IF
  40.     SET @qry; = CONCAT(@qry;, ' GROUP BY e.id_ser, e.fecha ASC WITH ROLLUP');
  41.     SET @fecha1 = fecha1;
  42.     SET @fecha2 = fecha2;
  43.     SET @grupo = Grupo;
  44.    
  45.     PREPARE stmt1 FROM @query;
  46.    
  47.     IF Grupo > 0 THEN
  48.         EXECUTE stmt1 USING @fecha1, @fecha2, @grupo;
  49.     ELSE
  50.         EXECUTE stmt1 USING @fecha1, @fecha2;
  51.     END IF;
  52.     DEALLOCATE @qry;
  53.    
  54. END$$
  55. DELIMITER ;

Habría que probarlo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 10/11/2013, 19:24
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Ejecutar consulta si cumple condicion

Hola gnzsoloyo Muchas gracias Nuevamente por tu tiempo,Por tu vocacion de enseñar, y por ser tan amable

Te cuento en cuanto a los resultados del SP Son reales, Nunca pongo a trabajar
un SP sin antes hacerle las pruebas respectivas, Pero TIENES MUCHA RAZON
Segun el Standar Sql dice en sus Normas, que siempre que haga una funcion de agregado
debo agrupar por todo lo que esta en el Select

y Asi lo intente pero te cuento que hay si los resultados fueron irreales
No se si es que no le he cogido mucho el tiro a la funcion with rollup

Pero como te digo, como lo tengo me funciona

Tambiem estoy Utilizando ELSEIF
Y en la ultima opcion me escapo con un ELSE


Y en cuanto a las consultas preparadas es totalmente Nuevo para mi
Nunca habia visto esto
me tocara ponerme a estudiar esto, ya que me apasiona el tema

de antemano muchas gracias por tu atencion,Orientación
durante todo este proceso Dios todopoderoso te Bendiga Grandemente

Cordial saludo
Beimar Trujillo
desde Bogota Colombia

Última edición por gnzsoloyo; 10/11/2013 a las 20:17 Razón: Politicas de Uso 2.3 y 2.6

Etiquetas: cumple, join, select
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 19:38.