2012-09-14 5 views
5

Im usar MS Access como mi base de datos y estoy usando siguiente consulta para obtener el tiempo trabajado:que intentó ejecutar una consulta que no incluya la expresión 'tiempo_SALIDA' especificada como una función de agregado en el acceso ms

select 
     in_time, 
     out_time, 
     datediff("n",b.in_time,c.out_time) as work_time, 
     log_date, 
     emp_id 
from 
    (select 
     LogTime as in_time, 
     SrNo, 
     LogID as emp_id, 
     LogDate as log_date 
    from LogTemp 
    where Type='IN') as b 
left join 
    (select 
     SrNo as out_id, 
     LogTime as out_time, 
     LogID as out_emp_id, 
     LogDate as out_log_date 
     from LogTemp 
    where Type = 'OUT' 
    group by SrNo) as c 
on (b.SrNo <> c.out_id 
    and b.emp_id = c.out_emp_id 
    and b.log_date = out_log_date) 
where 
    c.out_id > b.SrNo and 
    [log_date] >= #8/20/2012# and 
    [log_date] <= #8/20/2012# and 
    emp_id = "8" 
group by b.SrNo; 

Pero cuando yo haga la consulta Im consiguiendo el error siguiente:

"you tried to execute a query that does not include the specified expression 'out_time' 
as an aggregate function in ms access" error. 

Cualquier sugerencia de donde estoy en el error.

+2

Solo se ha agrupado por 'b.SrNo'. ¿Qué 'out_time' (y' in_time', y 'log_date', ...) quieres? .... –

+0

Por lo que veo, ¿supongo que querías ORDENAR BY b.SrNo y no GROUP BY? – Omnikrys

+0

Muchas gracias por la respuesta, funciona mencionando los campos en el grupo pero el problema es que la salida no está comparando dos filas, está comparando todas las filas entre sí ! [Estructura de la tabla] [1] SrNo LOGID LOGDATE TIPO DE LOGTIME 1 8 8/20/2012 9:32:12 AM Mi salida debe comparar y proporcionar la diferencia de tiempos de entrada y salida de filas sucesivas. No todas las "filas de entrada y salida". Por favor encuentre la pantalla adjunta. – saranya

Respuesta

5

Tiene un par de errores, en caso de que esté tratando de hacer un GROUP BY. En primer lugar, compruebe el MSDN for GROUP BY syntax, recommendations and samples.

Básicamente, sin ir más profundo, si se utiliza GROUP BY, cualquier columna en la cláusula SELECT no afectada por una función agregada como SUM, AVG, etc, debe aparecer en la cláusula GROUP BY. Por lo tanto, en su caso debe agregar:

LogTime as out_time, 
LogID as out_emp_id, 
LogDate as out_log_date 

En el GROUP BY de la segunda sub consulta. Y añadir

in_time, 
out_time, 
datediff("n",b.in_time,c.out_time) as work_time, 
log_date, 
emp_id 

En la principal GROUP BY al final.

Pero, como ya se señaló en un comentario, tal vez lo que quiere hacer es un ORDER BY. Entonces debería ser tan fácil como reemplazar GROUP por ORDER y debería funcionar. Solo asegúrate de que es eso lo que quieres.

+0

Muchas gracias por la respuesta que funciona después de colocar los campos en el grupo, pero el problema es que la salida no está comparando dos filas, sino que está comparando todas las filas entre sí. Mi estructura de tabla SrNo LOGID LOGDATE LOGTIME 1 8 20/08/2012 9:32:12 IN; 2 8 8/20/2012 9.52.10 AM OUT; 3 8 20/08/2012 9.56.10 AM IN; 4 8 20/08/2012 12.30 PM FUERA. Mi salida debe comparar y proporcionar la diferencia de tiempos de entrada y salida de filas sucesivas.No todas las "filas de entrada y salida". Amablemente encuentra la pantalla. – saranya

1

La tabla derivada C en LEFT JOIN no necesita ningún orden o agrupamiento. No hay ninguna razón por la que pueda ver por qué no debe coincidir con la tabla derivada B en FROM.

left join 
    (select 
     SrNo as out_id, 
     LogTime as out_time, 
     LogID as out_emp_id, 
     LogDate as out_log_date 
     from LogTemp 
    where Type = 'OUT') as c 

La declaración final de la consulta externa debe ser ORDER BY (como se ha mencionado), ya que la consulta externa no tiene ninguna función de agregado.

Sospecho que tendrá problemas con una unión explícita en una coincidencia no coincidente con MS Access, por lo que puede considerar moverla a una instrucción WHERE.

on (b.SrNo <> c.out_id 
Cuestiones relacionadas