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

Consulta de certificados médicos sin inasistencias asociadas

Estas en el tema de Consulta de certificados médicos sin inasistencias asociadas en el foro de Mysql en Foros del Web. Hola a todos, ¿qué tal? Necesito ayuda con una consulta. Tengo dos tablas: Código: +---------------+ | inasistencias | +---------------+ | id | | fecha | ...
  #1 (permalink)  
Antiguo 07/11/2012, 16:30
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Consulta de certificados médicos sin inasistencias asociadas

Hola a todos, ¿qué tal?

Necesito ayuda con una consulta. Tengo dos tablas:
Código:
+---------------+
| inasistencias |
+---------------+
| id            |
| fecha         |
| id_empleado   |
+---------------+

+------------------------+
| certificados_medicos   |
+------------------------+
| id                     |
| fecha_inicio_vigencaia |
| dias_reposo            |
| id_empleado            |
+------------------------+
Un certificado puede tener una fecha de inicio como 01/02/2012 y 3 días de reposo, por lo tanto justificaría las inasistencias del 01/02/2012, 02/02/2012 y 03/02/2012. La fecha de fin de vigencia la obtengo con DATE_ADD() en SQL.

Lo que quiero es hacer un SELECT que me traiga todos los certificados médicos que no tengan inasistencias asociadas, es decir, aquellos que por sus fechas de inicio y final de vigencia no tengan inasisistencias justificadas. Sería el caso en que yo cargué un certificado médico pero aún no cargue inasistencias para esas fechas.

Espero que se entienda el problema. Desde ya, gracias. Un saludo.
  #2 (permalink)  
Antiguo 08/11/2012, 02:53
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

¿Qué es lo que tienes por ahora? ¿O pretendes que te hagamos el problema entero?

Tienes que unir las tablas y poner que la fecha este de la inasistencia esté entre la fecha del inicio de vigencia y tres dias después
  #3 (permalink)  
Antiguo 08/11/2012, 11:42
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Hola.

No pretendo que hagan el trabajo por mí. Lo que tengo hasta ahora es la consulta que pongo a continuación, pero ésta sólo me trae los certificados médicos que no tienen la totalidad de las inasistencias cargadas, pero tienen al menos una. Lo que me falta es obtener los certificados que no tienen NINGUNA inasistencia asociada, según el rango de fechas que cubre el certificado y la fecha de cada inasistencia. No tengo idea de cómo encararlo y por eso pido ayuda.

Código:
SELECT certificado_medico.* 
FROM certificado_medico
INNER JOIN empleado ON certificado_medico.id_empleado = empleado.id_empleado
INNER JOIN
(SELECT certificado_medico.id, COUNT(*) AS 'cantidad' 
FROM inasistencia
INNER JOIN certificado_medico ON inasistencia.id_empleado = certificado_medico.id_empleado
WHERE inasistencia.fecha BETWEEN certificado_medico.fecha_inicio_vigencia AND DATE_ADD(certificado_medico.fecha_inicio_vigencia, INTERVAL(certificado_medico.dias_reposo - 1) day)
GROUP BY certificado_medico.id) AS cantidad_inasistencias
ON cantidad_inasistencias.id_certificado_medico = certificado_medico.id
WHERE dias_reposo > cant_inas.cantidad
ORDER BY certificado_medico.fecha_inicio_vigencia ASC
Un saludo.

Última edición por RabidFish; 08/11/2012 a las 11:49
  #4 (permalink)  
Antiguo 09/11/2012, 01:56
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Si usas left join, en vez de inner join te traerá también los certificados sin ninguna inasistencia.
  #5 (permalink)  
Antiguo 09/11/2012, 07:36
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Gracias, creo haber hecho la prueba con LEFT pero no obtuve los resultados que necesitaba. En cuanto pueda voy a probarlo nuevamente y cualquier cosa vuelvo a postear. Un saludo.
  #6 (permalink)  
Antiguo 04/12/2012, 14:51
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Hola.

Revivo el post porque probé utilizando LEFT JOIN en vez de INNER JOIN pero la consulta sigue arrojando los mismo resultados. El problema es que no puedo traer los certificados que no tengan inasistencias asociadas.

Saludos.
  #7 (permalink)  
Antiguo 04/12/2012, 16:02
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: Consulta de certificados médicos sin inasistencias asociadas

Postea la consulta tal y como la escribiste. No le aportes nada.
__________________
¿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 05/12/2012, 05:53
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

gnzsoloyo, es la que está más arriba, sólo que probé con LEFT en la quinta línea como me había dicho Heimish2000. Sigo obteniendo los mismos registros que antes, es decir los certificados que no tienen TODAS las inasistencias asociadas, pero al menos tienen una. Eso es correcto y está bien que me los devuelva, pero además necesito los que no tengan ninguna inasistencia asociada.

Código MySQL:
Ver original
  1. SELECT certificado_medico.*
  2. FROM certificado_medico
  3. INNER JOIN empleado ON certificado_medico.id_empleado = empleado.id_empleado
  4. (SELECT certificado_medico.id, COUNT(*) AS 'cantidad'
  5. FROM inasistencia
  6. INNER JOIN certificado_medico ON inasistencia.id_empleado = certificado_medico.id_empleado
  7. WHERE inasistencia.fecha BETWEEN certificado_medico.fecha_inicio_vigencia AND DATE_ADD(certificado_medico.fecha_inicio_vigencia, INTERVAL(certificado_medico.dias_reposo - 1) day)
  8. GROUP BY certificado_medico.id) AS cantidad_inasistencias
  9. ON cantidad_inasistencias.id_certificado_medico = certificado_medico.id
  10. WHERE dias_reposo > cantidad_inasistencias.cantidad
  11. ORDER BY certificado_medico.fecha_inicio_vigencia ASC

Probé distintas combinaciones de LEFT, RIGHT e INNER en todos los JOINs pero no logro lo que necesito.

Saludos.

Última edición por RabidFish; 05/12/2012 a las 06:33 Razón: Etiquetado incorrecto en código SQL.
  #9 (permalink)  
Antiguo 05/12/2012, 07:05
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Código MySQL:
Ver original
  1. SELECT certificado_medico.id, COUNT(*) AS 'cantidad'
  2. FROM inasistencia
  3. INNER JOIN certificado_medico ON inasistencia.id_empleado = certificado_medico.id_empleado
  4. WHERE inasistencia.fecha BETWEEN certificado_medico.fecha_inicio_vigencia AND DATE_ADD(certificado_medico.fecha_inicio_vigencia, INTERVAL(certificado_medico.dias_reposo - 1) DAY)

Ese es el JOIN que está haciendo que no salgan. Estas buscando inasistencias y cruzándolas con certificados, pero si no hay inasistencias no te devolverá nada.

Haz algo así (para el global)

Código MySQL:
Ver original
  1. FROM certificado_medico CM
  2. LEFT JOIN inasistencia INA ON
  3. CM.id_empleado = INA.id_empleado
  4. AND INA.fecha BETWEEN CM.Fecha_inicio AND DATE_ADD(CM.fecha_inicio_vigencia, INTERVAL(CM.dias_reposo - 1) DAY))
  #10 (permalink)  
Antiguo 05/12/2012, 08:24
 
Fecha de Ingreso: julio-2008
Ubicación: Córdoba, Argentina
Mensajes: 266
Antigüedad: 16 años, 4 meses
Puntos: 26
Respuesta: Consulta de certificados médicos sin inasistencias asociadas

Muchas gracias Heimish2000 y gnzsoloyo por la ayuda, ya pude resolverlo.

Saludos.

Etiquetas: certificados, select, sql, tabla
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 15:40.