Tengo dos tablas llamadas Employee y Time. Quiero asignar OnTrack=y si todas las TaskList del código de empleado 1E son y.

Intenté esto y estoy atascado

UPDATE Employee
SET OnTrack = 'y'
FROM Employee e
WHERE e.Code IN 
INNER JOIN (SELECT EmployeeCode FROM Time WHERE status = 'P') permanent
ON permanent.Employeecode = e.Code
AND permanent.Employeecode NOT IN
(SELECT EmployeeCode FROM Time t WHERE t.EmployeeCode=permanent.Employeecode and t.tasklist<>'y' )

Mi código está actualizando solo una fila. Alguien puede ayudarme porfavor?

Tabla de empleados:

Code    Name    Hours   OnTrack  
***********************************  
1E     SCOTT    32  
2E     LISA     32  
3E     MARK     32  

El horario es

Code    Employeecode    Status  workingHours    TaskList  
********************************************************  
1A          1E             P      8               Y  
2A          1E             P      8               Y  
3A          1E             P      8               N  
4A          2E             T      8               Y  
5A          2E             T      0               Y  
6A          3E             P      8               Y  

El resultado esperado está en la tabla de empleados, el estado de OnTrack debe actualizarse si todo su código de empleado tiene 'Y' en la tabla de tiempos como se muestra a continuación:

Code    Name    Hours   OnTrack  

1E      SCOTT    24      N  
2E      LISA      12     Y  
3E      MARK      0      Y  
sql
0
Raj 22 jul. 2016 a las 18:25

2 respuestas

La mejor respuesta

He creado algunas variables de tabla con datos de prueba. Qué tal esto:

DECLARE @Time TABLE (Code VARCHAR(2),Employeecode VARCHAR(2),Status CHAR(1), 
                     WorkingHours INT, TaskList CHAR(1))
INSERT @Time
VALUES  ('1A','1E','P',8,'Y'), 
        ('2A','1E','P',8,'Y'),  
        ('3A','1E','P',8,'N'), 
        ('4A','2E','T',8,'Y'),
        ('5A','2E','T',0,'Y'),
        ('6A','3E','P',8,'Y')
DECLARE @Employee TABLE (Code CHAR(2), Name VARCHAR(10), Hours INT, OnTrack CHAR(1))
INSERT @Employee
VALUES  ('1E','SCOTT',32,NULL),
        ('2E','LISA',32,NULL),  
        ('3E','MARK',32,NULL)

UPDATE e
SET e.OnTrack = t.TaskList
FROM @Employee e
JOIN (SELECT Employeecode, MIN(TaskList) TaskList
      FROM @Time
      GROUP BY Employeecode) t ON E.Code = T.Employeecode

SELECT *
FROM @Employee

Resultados:

Code    Name    Hours   OnTrack
1E      SCOTT   32      N
2E      LISA    32      Y
3E      MARK    32      Y

Si solo desea actualizar los empleados permanentes, simplemente agregue Status a la subconsulta.

SELECT Employeecode, MIN(TaskList) TaskList
    FROM @Time
    WHERE Status = 'p'
    GROUP BY Employeecode
1
BJones 22 jul. 2016 a las 18:54

(Suponiendo que está utilizando SQL Server) Intente primero seleccionar stmt y, si le gustan los resultados, utilice el stmt de actualización a continuación. Es difícil escribir código sin ver las tablas, pero simplemente siguiendo su explicación, esto debería ponerlo en la dirección correcta.

select * 
FROM Employee e 
INNER JOIN TIME t1 ON t1.EmployeeCode  =   e.code 
INNER JOIN TIME t2 ON t2.EmployeeCode  <>  e.code 
WHERE t1.status    = 'P' 
AND   t2.tasklist <> 'y'

No ejecute esto sin probar la selección anterior

UPDATE Employee
SET OnTrack = 'y'
FROM Employee e 
INNER JOIN TIME t1 ON t1.EmployeeCode   = e.code 
INNER JOIN TIME t2 ON t2.EmployeeCode  <> e.code 
WHERE t1.status    = 'P' 
AND   t2.tasklist <> 'y'
1
objectNotFound 22 jul. 2016 a las 16:34