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

[SOLUCIONADO] Creacion de Cursor Para Subtotalizar Tiempos por Persona

Estas en el tema de Creacion de Cursor Para Subtotalizar Tiempos por Persona en el foro de Mysql en Foros del Web. Muy buenos dias apreciados Ingenieros de la programación Tengo un Problema pues nunca he trabajado con Cursores y en este momento es necesario ya que ...
  #1 (permalink)  
Antiguo 30/10/2013, 10:50
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Creacion de Cursor Para Subtotalizar Tiempos por Persona

Muy buenos dias apreciados Ingenieros de la programación
Tengo un Problema pues nunca he trabajado con Cursores y en este momento es necesario
ya que necesito Mostrar un informe de horas Trabajadas por Empleado

Con este Sp que tengo muestro todos los resultados de los empleados en un rango de fechas Ordenado por Empleados

Luego lo exporto a Excel y me toca decirle en Datos -Subtotal
Por cada Cambio en el Nombre de cliente, Utilize la funcion Suma - Agregar Subtotal a la Columna -TiempoLaborado

Ahora el Usuario me dice que quiere ver todo pero en una Pagina Web, y que ya no quiere seguir haciendo el proceso en Excel
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE MARCACIONES (IN  fecha1 DATE, fecha2 DATE)          
  3.   SELECT
  4.       empre.nombre_razonsocial,
  5.       e.fecha,
  6.       CONCAT(p.Apellidos,' - ',p.Nombres) Nombres,
  7.       p.Documento,
  8.       e.fecha_Entrada,
  9.       e.fecha_Salida_Almuerzo,
  10.       e.fecha_Entrada_Almuerzo,  
  11.       TIMEDIFF(e.fecha_Entrada_Almuerzo,e.fecha_Salida_Almuerzo) Total_Receso,
  12.       e.fecha_Salida Salida_Laboral,
  13.       TIMEDIFF(e.fecha_Salida,e.fecha_Entrada) Total_Labor,
  14.       e.Fecha_Ultimo_Registro  Ultima_Marcacion
  15.     FROM  eventos e
  16.       INNER JOIN personas p ON e.id_ser = p.id_ser
  17.       INNER JOIN  personas_empresa ps ON ps.id_ser = p.id_ser
  18.       INNER JOIN  empresas empre ON empre.id_empresa = ps.id_empresa
  19.     WHERE e.fecha BETWEEN fecha1 AND fecha2
  20.     ORDER BY  p.Nombres,e.fecha ASC
  21.     LIMIT 2000;
  22. END$$
  23.  
  24. #Restaura el delimitador
  25. DELIMITER ;
  26.  
  27. Call Marcaciones ('2013-10-01','2013-10-03');

Segun he Investigado esto lo puedo hacer Utilizando un Cursor pero en el momento
no se como?

De antemano quedo muy agradecido por su atencion
Si Tienen un Ejemplo o me pueden Orientar
Cordial saludo

Última edición por gnzsoloyo; 30/10/2013 a las 11:51 Razón: Porfavor, etiquetar el codigo con el Highlight que corresponde (SQL o MySQL)
  #2 (permalink)  
Antiguo 30/10/2013, 12:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Hola beimar26:

No recomiendo el uso de cursores a menos que sea absolutamente necesario hacerlo... debido a que tienen un desempeño bastante lento y pueden afectar el rendimiento de la BD, por lo general puedes buscar otra alternativas para obtener el mismo resultado con consultas simples o inclusive con procedimientos almacenados, pero evitando el tema de los cursores, el detalle es que no nos das mucha información acerca de tus tablas o tus datos, por lo que resulta algo complicado darte una respuesta puntual...

Sería mas sencillo si comienzas por explicarnos exactamente qué es lo que necesitas, y que nos expliques tu modelo... aunque pongas la consulta, resulta casi imposible saber qué es lo que hace. Manejas 4 tablas pero no nos dices cuál es la estructura de cada una (los campos que tienen), ni nos dices cómo almacenas la información o cómo están relacionadas unas tablas con otras... tampoco nos muestras cuál es la salida que arroja y qué es lo que quieres obtener como salida...

No somos adivinos (al menos yo no lo soy jejejejeje) pero me gustaría poder ayudarte.

Ahora bien, tratando de simplificar lo que expones con tu problema y enfocándome sólo en la parte de obtener subtotales, creo que un simple ROLLUP te serviría.

http://dev.mysql.com/doc/refman/5.0/...modifiers.html


Código MySQL:
Ver original
  1. mysql> SELECT year, country, product, SUM(profit)
  2.     -> FROM sales
  3.     -> GROUP BY year, country, product;
  4. +------+---------+------------+-------------+
  5. | year | country | product    | SUM(profit) |
  6. +------+---------+------------+-------------+
  7. | 2000 | Finland | Computer   |        1500 |
  8. | 2000 | Finland | Phone      |         100 |
  9. | 2000 | India   | Calculator |         150 |
  10. | 2000 | India   | Computer   |        1200 |
  11. | 2000 | USA     | Calculator |          75 |
  12. | 2000 | USA     | Computer   |        1500 |
  13. | 2001 | Finland | Phone      |          10 |
  14. | 2001 | USA     | Calculator |          50 |
  15. | 2001 | USA     | Computer   |        2700 |
  16. | 2001 | USA     | TV         |         250 |
  17. +------+---------+------------+-------------+
  18.  
  19. mysql> SELECT year, country, product, SUM(profit)
  20.     -> FROM sales
  21.     -> GROUP BY year, country, product WITH ROLLUP;
  22. +------+---------+------------+-------------+
  23. | year | country | product    | SUM(profit) |
  24. +------+---------+------------+-------------+
  25. | 2000 | Finland | Computer   |        1500 |
  26. | 2000 | Finland | Phone      |         100 |
  27. | 2000 | Finland | NULL       |        1600 |
  28. | 2000 | India   | Calculator |         150 |
  29. | 2000 | India   | Computer   |        1200 |
  30. | 2000 | India   | NULL       |        1350 |
  31. | 2000 | USA     | Calculator |          75 |
  32. | 2000 | USA     | Computer   |        1500 |
  33. | 2000 | USA     | NULL       |        1575 |
  34. | 2000 | NULL    | NULL       |        4525 |
  35. | 2001 | Finland | Phone      |          10 |
  36. | 2001 | Finland | NULL       |          10 |
  37. | 2001 | USA     | Calculator |          50 |
  38. | 2001 | USA     | Computer   |        2700 |
  39. | 2001 | USA     | TV         |         250 |
  40. | 2001 | USA     | NULL       |        3000 |
  41. | 2001 | NULL    | NULL       |        3010 |
  42. | NULL | NULL    | NULL       |        7535 |
  43. +------+---------+------------+-------------+

si observas el ejemplo, con ROLLUP puedes ir mostrando los subtotales de cada grupo, y al final el gran total. no sé si esto te pueda servir, pero creo que si. puedes manipular esta consulta para que en lugar de NULL coloque las leyendas que tú quieras. Dale un vistazo y si continuas con problemas, trata de explicar un poco mejor tu problema y recuerda que nosotros no conocemos tu modelo, entre más detalles nos puedas dar acerca de esté y de los datos que almacenas, más fácil será tratar de ayudarte.

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/10/2013, 14:30
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Hola Leonardo Muchisimas gracias por tu Respuesta la verdad no conocia esa funcion en Mysql es Sorprendente lo que hace

Ahora mi pregunta si se puede Leonardo es como
organizo la informacion ya que despues del with Rollup
Pongo Order by miscampos y me genera errror

de antemano muchas gracias por tu Atencion
  #4 (permalink)  
Antiguo 30/10/2013, 14:49
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Listo Leonardo ya se como funciona con el order by

Código MySQL:
Ver original
  1. select fecha,id_ser,
  2. SUM(TIMEDIFF(fecha_Salida,fecha_Entrada)) AS Total_Labor
  3.  from
  4.  eventos     
  5.  where fecha between '2013-10-01' and '2013-10-02'
  6.  group by  id_ser,fecha desc with rollup

Muchisimas gracias por tu Tiempo, tu Orientacion Dios te Bendiga

group by id_ser,fecha desc with rollup

Cordial saludo
Beimar Trujillo
Desde Bogota Colombia

Última edición por gnzsoloyo; 30/10/2013 a las 16:48
  #5 (permalink)  
Antiguo 30/10/2013, 16:37
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Problema con ROLLUP

Muy buenas tardes apreciados Ingenieros
Tengo el Siguiente Problema al ejecutar esta consulta

Código MySQL:
Ver original
  1. SELECT id_ser,fecha,
  2.  SEC_TO_TIME(SUM((TIME_TO_SEC(fecha_Salida) - TIME_TO_SEC(fecha_Entrada)))) AS 'Total_Labor'
  3. # TIMEDIFF(fecha_Salida,fecha_Entrada) AS 'Total_Labor'
  4.  FROM eventos  
  5.  WHERE fecha BETWEEN '2013-10-01' AND '2013-10-02'
  6.  AND id_ser=68
  7.  GROUP BY  id_ser,fecha WITH ROLLUP ;

en el SET de resultados me muestra 4 Valores
donde realmente solo deberia mostrarme 3 por Ejemplo


id_ser fecha Total_Labor
68 2013-10-01 10:11:11
68 2013-10-02 09:58:52
68 \N 20:10:03 # Hasta aquí Debería de Mostrarme


\N \N 20:10:03 #Este registro me sobra no se porque me lo muestra

y si multiplicamos eso por 5000 Datos me estaria sacando Talegadas de Basura

De antemano muchas gracias por su atención y Orientación

Cordial saludo
Beimar Trujillo

Última edición por gnzsoloyo; 30/10/2013 a las 16:43
  #6 (permalink)  
Antiguo 30/10/2013, 16:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con ROLLUP

TE lo muestra porque es la sumatoria total. Es un resultado esperado en el uso de ROLLUP.
Lee el manual de referencia, y verás claramente los ejemplos.
Incluso este mismo ejemplo ya te lo ha pasado @leonardo_josue:
Código MySQL:
Ver original
  1. mysql> SELECT year, country, product, SUM(profit)
  2.     -> FROM sales
  3.     -> GROUP BY year, country, product WITH ROLLUP;
  4. +------+---------+------------+-------------+
  5. | year | country | product    | SUM(profit) |
  6. +------+---------+------------+-------------+
  7. | 2000 | Finland | Computer   |        1500 |
  8. | 2000 | Finland | Phone      |         100 |
  9. | 2000 | Finland | NULL       |        1600 |
  10. | 2000 | India   | Calculator |         150 |
  11. | 2000 | India   | Computer   |        1200 |
  12. | 2000 | India   | NULL       |        1350 |
  13. | 2000 | USA     | Calculator |          75 |
  14. | 2000 | USA     | Computer   |        1500 |
  15. | 2000 | USA     | NULL       |        1575 |
  16. | 2000 | NULL    | NULL       |        4525 |
  17. | 2001 | Finland | Phone      |          10 |
  18. | 2001 | Finland | NULL       |          10 |
  19. | 2001 | USA     | Calculator |          50 |
  20. | 2001 | USA     | Computer   |        2700 |
  21. | 2001 | USA     | TV         |         250 |
  22. | 2001 | USA     | NULL       |        3000 |
  23. | 2001 | NULL    | NULL       |        3010 |
  24. | NULL | NULL    | NULL       |        7535 |
  25. +------+---------+------------+-------------+

De hecho, siendo este tema una continuación del otro, será combinado con los restantes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 30/10/2013, 17:03
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Hola gnzsoloyo
Muchas gracias por Responder si Tienes razon
pero el resultado total en este caso me aparece en la tercera Fila

No comprendo porque Saca una 4 Fila Nuevamente Mostrandome un Totalizado que realizo en la tercera

Solicitu tus Disculpas, si estoy Siendo porfiado
pero asi lo entendi en el ejemplo de Leonardo, como en el ejemplo que da Mysql

Cordial saludo
  #8 (permalink)  
Antiguo 30/10/2013, 17:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Cita:
No comprendo porque Saca una 4 Fila Nuevamente Mostrandome un Totalizado que realizo en la tercera
Como te dije: Es le resultado final de la sumatoria, el de la tercera fila es lo que sería un "subtotal" aplicado sobre el primer campo, mientras que que el cuarto registro vendría a ser lo que puedes denominar "resumen".
El algoritmo está planteado para que los agrupamientos devuelvan más de un subgrupo de resultados, y forzosamente tira ese resumen.
No notas eso porque estás filtrando por un único id_ser. Si hubieses puesto dos o más, ese "resumen tendría perfecto sentido.
DE hecho, si te fijas bien, Excel hace exactamente lo mismo.
Simplemente tienes que omitirlo al programar la visualización.
__________________
¿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 30/10/2013, 17:20
 
Fecha de Ingreso: octubre-2013
Mensajes: 34
Antigüedad: 11 años
Puntos: 0
Respuesta: Creacion de Cursor Para Subtotalizar Tiempos por Persona

Ok Siendo asi,Listo no tengo mas Dudas
Apreciado Ingeniero Muchas gracias
Dios todopodero te Bendiga

Cordial saludo
Ing Beimar Trujillo
Desde Bogota
Colombia

Etiquetas: cursor, join, persona, registro, rollup, 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 22:09.