sentencia SQL HAVING MAX (+ alguna cosa) = + alguna cosa
Pregunta
Tengo problemas con Microsoft Access 2003, que se queja de esta declaración:
select cardnr
from change
where year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'
Lo que quiero hacer es, para cada cardnr distinta en el cambio de la tabla, para encontrar la fila con la más reciente (fecha + hora) que es antes del año 2009, y luego sólo tienes que seleccionar las filas con cardto = 'VIP'.
validador dice que está bien, Acceso dice que no pasa nada .
Este es el mensaje que recibo: "Ha intentado ejecutar una consulta que no incluya la expresión especificada 'max (hora y fecha) = tiempo + fecha y cardto =' VIP 'y cardnr =' como parte de un agregado función ".
Podría alguien explicar lo que estoy haciendo mal y la forma correcta de hacerlo? Gracias
Nota:. El nombre de campo y de mesa son traducidos y no chocan con ningún palabras reservadas, no tengo problemas con los nombres
Solución
Trate de pensar en ello como esto - se aplicarán después de la agregación se realiza. Por lo tanto, no se puede comparar a las expresiones no agregados (ni por hora y la fecha, ni por cardto).
Sin embargo, para conseguir la última (principio es el mismo para conseguir filas relacionadas con otras funciones agregadas como weel) fecha y hora que usted puede hacer algo como:
SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date)
FROM change sub
WHERE sub.cardnr = main.cardnr AND
year(date)<2009
AND cardto='VIP')
(suponiendo que parte de la fecha de su campo de tiempo es el mismo para todos los registros, que tiene dos campos de fecha / hora no está en su mejor interés y también el uso de palabras reservadas para los nombres de campo puede ser contraproducente en algunos casos)
Funciona porque la subconsulta se filtra sólo en los registros que usted está interesado en de la consulta externa.
La aplicación de ese mismo año (fecha) <200 y cardto = 'VIP' a la consulta externa pueden mejorar aún más el rendimiento.