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

[SOLUCIONADO] Mostrar Trabajadores sin trabajo asignado actualmente

Estas en el tema de Mostrar Trabajadores sin trabajo asignado actualmente en el foro de Bases de Datos General en Foros del Web. Mostrar PERSONAS sin trabajo asignado actualmente Buen día ! tengo 3 tablas PERSONAS CARGOS CARGOS_PERSONAS CARGOS_PERSONAS es la union de CARGOS y PERSONAS sus campos ...
  #1 (permalink)  
Antiguo 29/03/2019, 08:58
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 13 años, 3 meses
Puntos: 3
Mostrar Trabajadores sin trabajo asignado actualmente

Mostrar PERSONAS sin trabajo asignado actualmente

Buen día !

tengo 3 tablas

PERSONAS

CARGOS


CARGOS_PERSONAS

CARGOS_PERSONAS es la union de CARGOS y PERSONAS

sus campos son

ID - CARGO - PERSONA - DESDE (fecha desde que tiene cargo) - HASTA (fecha hasta que cumplio con el cargo y puede ser NULL en caso de que el cargo esté vigente)

quiero sacar las personas que no tengan cargos vigentes o que jamas hayan tenido cargo alguno.

esta consulta me devuelve lo que neesito hasta cierto punto


Código:
SELECT
    *
FROM
    `personas`
LEFT JOIN `cargo_personas` ON `persona_cargo_persona` = `id_persona`
WHERE EXISTS
    (
    SELECT
        *
    FROM
        `cargo_personas`
    WHERE
        `personas`.`id_persona` = `cargo_personas`.`persona_cargo_persona` AND `hasta_cargo_persona` IS NOT NULL
) OR NOT EXISTS(
    SELECT
        *
    FROM
        `cargo_personas`
    WHERE
        `personas`.`id_persona` = `cargo_personas`.`persona_cargo_persona`
)
GROUP BY
    `id_persona`
pero el problema está en que por ejemplo una persona que fungio de vigilante DESDE 12-12-2018 HASTA 03-03-2019 y se le asigno un cargo actual DESDE 04-03-2019 tambien me apareceria en la consulta y no deberia porque tiene cargo actual
__________________
No le pare bola a la vida, que la vida no le para bolas a uno!
  #2 (permalink)  
Antiguo 29/03/2019, 09:21
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

Porque tienes una tabla con la union de otras 2, ahi estas duplicando informacion que podrias tener en la tabla de cargos.

Podrias poner un ejemplo de tus datos, para poder ayudarte mejor? que es lo que tienes y que necesitas porque asi como explicas no logro entender el porque no salen los datos en la consulta
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 29/03/2019, 09:54
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 13 años, 3 meses
Puntos: 3
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

Cita:
Iniciado por Libras Ver Mensaje
Porque tienes una tabla con la union de otras 2, ahi estas duplicando informacion que podrias tener en la tabla de cargos.

Podrias poner un ejemplo de tus datos, para poder ayudarte mejor? que es lo que tienes y que necesitas porque asi como explicas no logro entender el porque no salen los datos en la consulta
La tabla CARGOS_PERSONAS se usa para asignar cargos y a la vez queda como historial de cargos de una persona.

es decir, con ella podria obtener los cargos desempeñados por una persona y el tiempo en dichos cargos.

PERSONAS

id---nombre
1----LIBRAS
2----Camatagua123
3----forosDelWeb

CARGOS

id-----nombre--------descripcion
1---VIGILANTE---vigilar instalaciones
2---Secretario----Trabajos administrativos

CARGOS_PERSONAS

id--persona---cargo-----desde------------hasta
1------1---------2------2019-03-04----NULL
2------3---------1------2018-06-20----2018-09-03
2------1---------1------2018-12-20----2019-03-03

aqui puedo traducirte lo siguiente de la tabla CARGOS_PERSONAS

- La persona 3 (ForosDelWeb) trabajo de vigilante entre las fechas 2018-06-20 y 2018-09-03. actualmente NO posee trabajo actual en la empresa.

- La persona 1 (LIBRAS) trabajo de vigilante entre las fechas 2018-12-20 y 2019-03-03. Actualmente SI posee trabajo actual en la empresa (SECRETARIO DESDE 2019-03-04).

- La persona 2 (CAMATAGUA123) nunca ha tenido trabajo alguno en la empresa.

Con la consulta en el primer mensaje (con el que aperture el tema) puedo extreaer a

CAMATAGUA123 que no ha tenido cargo alguno (BIEN) y a forosDelWeb que trabajo algun tiempo (BIEN) pero tambien extraigo a LIBRAS que trabajo anteriormente pero actualmente está trabajando (MAL)
__________________
No le pare bola a la vida, que la vida no le para bolas a uno!
  #4 (permalink)  
Antiguo 29/03/2019, 14:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

Código SQL:
Ver original
  1. CREATE TABLE #personas(
  2. id INT,
  3. nombre nvarchar(20)
  4. )
  5.  
  6. INSERT INTO #personas VALUES (1,'LIBRAS')
  7. INSERT INTO #personas VALUES (2,'Camatagua123')----Camatagua123
  8. INSERT INTO #personas VALUES (3,'forosDelWeb')----forosDelWeb
  9.  
  10.  
  11. CREATE TABLE #cargos
  12. (
  13. id INT,
  14. nombre nvarchar(20),
  15. descripcion nvarchar(20)
  16. )
  17.  
  18.  
  19. INSERT INTO #cargos VALUES (1,'VIGILANTE','vigilar')
  20. INSERT INTO #cargos VALUES (2,'Secretario','trabajos')
  21. INSERT INTO #cargos VALUES (3,'Tester','Test')
  22.  
  23.  
  24. CREATE TABLE #cargos_personas
  25. (
  26. id INT,
  27. persona INT,
  28. cargo INT,
  29. desde datetime,
  30. hasta datetime
  31. )
  32.  
  33. INSERT INTO #cargos_personas VALUES (1,1,2,'2019-03-04',NULL)
  34. INSERT INTO #cargos_personas VALUES (2,3,1,'2018-06-20','2018-09-03')
  35. INSERT INTO #cargos_personas VALUES (3,1,1,'2019-03-04','2019-03-03')
  36. INSERT INTO #cargos_personas VALUES (4,1,1,'2019-03-04','2019-03-03')
  37. INSERT INTO #cargos_personas VALUES (5,1,3,'2019-03-29','2019-04-30')
  38.  
  39.  
  40.  
  41. --Personas con cargo vigente
  42. SELECT t1.id, t1.nombre,t2.cargo, 'Sin Cargo Vigente' AS resultado FROM #personas AS t1
  43. LEFT JOIN (
  44. SELECT * FROM #cargos_personas AS t1
  45. WHERE  hasta <= getdate()
  46. ) AS t2 ON (t1.id=t2.persona)
  47. WHERE persona IS NOT NULL
  48.  
  49. UNION ALL
  50.  
  51. SELECT t1.id, t1.nombre,t2.cargo, 'No ha tenido Cargo' AS resultado FROM #personas AS t1
  52. LEFT JOIN (
  53. SELECT persona,cargo FROM #cargos_personas AS t1
  54. ) AS t2 ON (t1.id=t2.persona)
  55. WHERE persona IS NULL

Este es el resultado:

id nombre cargo resultado
1 LIBRAS 1 Sin Cargo Vigente
1 LIBRAS 1 Sin Cargo Vigente
3 forosDelWeb 1 Sin Cargo Vigente
2 Camatagua123 NULL No ha tenido Cargo

Si vemos los datos libras tiene un cargo vigente(cargo 3) y no aparece, solo aparecen los cargos ya vencidos de foros del web y de Libras, libras tuvo 2 veces el cargo y forosdelweb 1
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 29/03/2019 a las 14:54
  #5 (permalink)  
Antiguo 29/03/2019, 14:58
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 13 años, 3 meses
Puntos: 3
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

Gracias por tu ayuda Libras, pero creo que me comprendiste mal, :(

lo que Necesito es: extraer a las personas que no han tenido cargo junto con las personas que ya tuvieron cargos y NO TIENEN CARGO ACTUAL

deberia de arrojar segun el ejemplo arriba:

CAMATAGUA123: porque no ha tenido cargo

y a

forosDelWeb: porque trabajo anteriormente y ACTUALMENTE NO TIENE CARGO.
__________________
No le pare bola a la vida, que la vida no le para bolas a uno!
  #6 (permalink)  
Antiguo 29/03/2019, 15:33
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

ya tienes la base piensale poquito no?

Código SQL:
Ver original
  1. --Personas con cargo vigente
  2. SELECT t1.id, t1.nombre,t2.cargo, 'Sin Cargo Vigente' AS resultado FROM #personas AS t1
  3. LEFT JOIN (
  4. SELECT * FROM #cargos_personas AS t1
  5. WHERE  hasta <= getdate()  
  6. ) AS t2 ON (t1.id=t2.persona)
  7. WHERE persona IS NOT NULL
  8. AND persona NOT IN (
  9. SELECT persona FROM #cargos_personas AS t1
  10. WHERE  hasta >= getdATE()
  11. )
  12.  
  13.  
  14. UNION ALL
  15.  
  16. SELECT t1.id, t1.nombre,t2.cargo, 'No ha tenido Cargo' AS resultado FROM #personas AS t1
  17. LEFT JOIN (
  18. SELECT persona,cargo FROM #cargos_personas AS t1
  19. ) AS t2 ON (t1.id=t2.persona)
  20. WHERE persona IS NULL

3 forosDelWeb 1 Sin Cargo Vigente
2 Camatagua123 NULL No ha tenido Cargo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 31/03/2019, 17:19
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 13 años, 3 meses
Puntos: 3
Respuesta: Mostrar Trabajadores sin trabajo asignado actualmente

Cita:
Iniciado por Libras Ver Mensaje
ya tienes la base piensale poquito no?

Código SQL:
Ver original
  1. --Personas con cargo vigente
  2. SELECT t1.id, t1.nombre,t2.cargo, 'Sin Cargo Vigente' AS resultado FROM #personas AS t1
  3. LEFT JOIN (
  4. SELECT * FROM #cargos_personas AS t1
  5. WHERE  hasta <= getdate()  
  6. ) AS t2 ON (t1.id=t2.persona)
  7. WHERE persona IS NOT NULL
  8. AND persona NOT IN (
  9. SELECT persona FROM #cargos_personas AS t1
  10. WHERE  hasta >= getdATE()
  11. )
  12.  
  13.  
  14. UNION ALL
  15.  
  16. SELECT t1.id, t1.nombre,t2.cargo, 'No ha tenido Cargo' AS resultado FROM #personas AS t1
  17. LEFT JOIN (
  18. SELECT persona,cargo FROM #cargos_personas AS t1
  19. ) AS t2 ON (t1.id=t2.persona)
  20. WHERE persona IS NULL

3 forosDelWeb 1 Sin Cargo Vigente
2 Camatagua123 NULL No ha tenido Cargo

asi me quedó la consulta!

Cita:

SELECT * FROM `web_personas` AS `t1` LEFT JOIN (SELECT * FROM `web_cargo_personas` AS `t3` WHERE `t3`.`carper_hasta` <= CURRENT_DATE() GROUP BY `t3`.`per_id`) AS `t2` ON `t2`.`per_id` = `t1`.`per_id` WHERE `t2`.`per_id` NOT IN (SELECT `t4`.`per_id` FROM `web_cargo_personas` AS `t4` WHERE `t4`.`carper_hasta` IS NULL)
Gracias Libras ! ahora me toca pasarla a Eloquent Laravel :/
__________________
No le pare bola a la vida, que la vida no le para bolas a uno!

Etiquetas: trabajo
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 12:48.